宏__cplusplus
宏__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时,会立即报错并终止编译。