(1)宏__cplusplus

在C与C++混合编写的代码中,常常会在头文件中进行如下编写:

ifdef cplusplusextern “C” {
// 包含对应的头文件#include <>
#ifdef
cplusplus}#endif

以上述方式定义的头文件可以被 #include 到 C 文件中进行编译,也可以被 #include 到 C++ 文件中进行编译。extern “C” 可以抑制 C++ 对函数名、变量名等符号进行名称重定义,因此编译出的 C 目标文件和 C++ 目标文件中的变量名、函数名等都相同,链接器可以可靠地对两种类型的目标文件进行链接。这种作法成为了 C 和 C++ 混合编写的典型做法。

但当查看 cplusplus 宏的定义时可以发现,cplusplus 是被定义成整数。而且随着 C++ 标准的变化,定义的整数值也在跟随着变化。通常新版本的 C++ 标准会定义一个更大的值,比如 C++03 中被定义为 199711L,而 C++11 中被定义为 201103L。因此可以根据 __cplusplus 宏的值进行一些处理,比如下面的代码用于检测是否支持 C++11 :

if __cplusplus < 201103L
#error “should use c++11 implementation”
#endif

这里使用 #error 预处理,使得不支持 C++11 则立刻停止编译。