_cplusplus宏经常出现在C与C++混合编写的代码中, 一般放在头文件中,比如
#ifdef __cplusplus
extern "C" {
#endif
//some code ...
#ifdef __cplusplus
}
#endif
由于extern "C" 可以抑制C++对函数名、变量名进行名称重整,因些编译出的C目标文件和C++目标文件中的函数名、变量名都是相同的,链接器可以可靠地对两种类型的目标文件进行链接。这种类型的头文件可以被#include到C文件中进行编译,也可以被#include到C++文件中进行编译。 因此这种做法成为了C与C++混用头文件的典型做法。
然而,你不知道的可能是__cplusplus是被定义为某个值的,在C++11之前或许跟本不用关心它。但是在C++11中可以用它来提早暴露编译问题。
//C++03: __cplusplus = 199711L
//C++11: __cplusplus = 201103L
#if __cplusplus < 201103L
#error "Should use --std=c++11 option for compile."
#endif
如代码所示,不同C++标准中__cplusplus值是不同的。如果代码中使用了C++11的特性,这里可以做检查。如果使用的不是C++11编译器,那么可以使用#error预处理指令报出问题所在。编译输出如下所示,非常清楚的指出错误所在。
horen:~/cplusplus/cplusplus$ g++ -g cplusplus.cpp -o cplusplus;
In file included from cplusplus.cpp:3:0:
cplusplus.h:8:6: error: #error "Should use --std=c++11 option for compile."
#error "Should use --std=c++11 option for compile."