問題出現了:是否應該使用#if
或#ifdef
來包裝extern "C"
。即:是否可以定義__cplusplus等於零?
#if __cplusplus
extern "C" {
#endif
或
#ifdef __cplusplus
extern "C" {
#endif
這引出了一個問題:是否有過在那裏__cplusplus被定義爲等於零的情況呢?
問題出現了:是否應該使用#if
或#ifdef
來包裝extern "C"
。即:是否可以定義__cplusplus等於零?
#if __cplusplus
extern "C" {
#endif
或
#ifdef __cplusplus
extern "C" {
#endif
這引出了一個問題:是否有過在那裏__cplusplus被定義爲等於零的情況呢?
根據標準,__cplusplus
宏必須被定義,確切的定義取決於正在使用的C++標準,但它不會爲零。
例如,對於C++ 11,其必須爲爲201103L
,並附註「此打算未來版本的此標準將用更大的值替換此宏的值」。
從歷史上看,在某些古代不合格的編譯器中,您可能會挖掘起來,__cplusplus
被定義爲0以指示與標準不一致。這只是歷史利益。
參見:How are the __cplusplus directive defined in various compilers?
確實有這樣的編譯器,而Microsoft Visual C++就是其中之一。 – EJP
@EJP很有意思,所以'#ifdef'不會與那個編譯器一起工作,錯誤地表明你正在編譯一個C++源代碼,當它實際上是C? –
@EJP或者你是否真的說它爲C++構建定義'__cplusplus'爲'0'?在這種情況下,*絕對*必須使用'#ifdef',因爲#if會失敗。我現在變得更加困惑。 –
如果使用的是C編譯器,然後'__cplusplus'將無法在所有定義的 - 因此,我認爲'#ifdef'是正確的選擇。 –
@MarkRansom:沒有必要,根據標準,如果'X'未定義就好了,你可以'#if X'。 –