宏__cplusplus有2個作用:
1)用於C/C++混合代碼;
2)用於判斷C++版本;
C, C++混合代碼
編寫C/C++混合代碼時,頭文件常會有如下聲明:
#ifdef __cplusplus
extern "C" {
#endif
// C代碼
#ifdef __cplusplus
}
#endif
這種頭文件可以被#include到C文件(.c)中進行編譯,也可以被#include到C++文件(.cpp/.cxx/.cc等)中進行編譯。因為extern "C"可以抑制C++對函數名、變量名等符號(symbol)進行名稱重整(name mangling),因此,編譯出的C目標文件和C++目標文件中的變量、函數名稱等符號相同,而沒有重整。這樣,鏈接器可以可靠地對兩種類型的目標文件進行鏈接。
C++標准版本
除了編寫C/C++混合代碼時用到,__cplusplus也常用於判斷編譯器支持的C++標准,如C++03標准中,__cplusplus值被預定義為199711L,C++11標准中,__cplusplus被預定義為201103L。
例如,程序員如果想要確定代碼使用支持C++11編譯器進行編譯時,可這樣檢測:
#if __cplusplus < 201103L
#error "should use C++11 implmentation"
#endif
當不支持代碼編譯C++11時,會立即報錯並終止編譯。