2017-09-12 122 views
5

問題出現了:是否應該使用#if#ifdef來包裝extern "C"。即:是否可以定義__cplusplus等於零?

#if __cplusplus 
extern "C" { 
#endif 

#ifdef __cplusplus 
extern "C" { 
#endif 

這引出了一個問題:是否有過在那裏__cplusplus被定義爲等於零的情況呢?

+0

如果使用的是C編譯器,然後'__cplusplus'將無法在所有定義的 - 因此,我認爲'#ifdef'是正確的選擇。 –

+0

@MarkRansom:沒有必要,根據標準,如果'X'未定義就好了,你可以'#if X'。 –

回答

3

根據標準,__cplusplus必須被定義,確切的定義取決於正在使用的C++標準,但它不會爲零。

例如,對於C++ 11,其必須爲201103L,並附註「此打算未來版本的此標準將用更大的值替換此宏的值」。

從歷史上看,在某些古代不合格的編譯器中,您可能會挖掘起來,__cplusplus被定義爲0以指示與標準不一致。這只是歷史利益。

參見:How are the __cplusplus directive defined in various compilers?

+0

確實有這樣的編譯器,而Microsoft Visual C++就是其中之一。 – EJP

+0

@EJP很有意思,所以'#ifdef'不會與那個編譯器一起工作,錯誤地表明你正在編譯一個C++源代碼,當它實際上是C? –

+0

@EJP或者你是否真的說它爲C++構建定義'__cplusplus'爲'0'?在這種情況下,*絕對*必須使用'#ifdef',因爲#if會失敗。我現在變得更加困惑。 –