C++11中__cplusplus特性

宏__cplusplus使用

宏__cplusplus主要解决C/C++混合编程问题,一般用法如下:

#ifdef __cplusplus
extern "C" {
#endif
…
#ifdef __cplusplus
}
#endif

extern “C”可以抑制C++对函数名、变量名进行名称重整,故编译出的C目标文件和C++目标文件名的函数名、变量名都是相同的,链接器能可靠地对两种类型的目标文件进行链接。

使用上述定义的头文件可以在.c文件中编译,也可以在.cpp文件中编译,它是C/C++混用头文件的典型做法。

注意:__cplusplus是某一个被定义的值,具体如下:

C++03:__cplusplus = 199711L
C++11:__cplusplus = 201103L
所以编译是否使用C++11,可以进行如下定义:
#if __cplusplus < 201103L
       #error “Should use –std=c++11 option for compile
#endif

扩展:extern “C”的作用如下:

  1. 核心作用:实现C和C++的混合编程。extern “C”提供一个链接交换指定符号,用于告诉C++这段函数是C函数,extern “C”后面的函数不使用C++的名字修饰,而是使用C。
  2. C++支持函数重载,C不支持函数重载。函数被C++编译后在库中的名字与C语言不同。如void add(int a, int b),该函数在C编译器编译后,库中名字为_add,而C++编译器则会生成add_int_int的名字。故C++提供C链接交换指定符号extern “C”来解决名字匹配问题。
  3. 被extern “C”限定的函数或变量是extern类型,extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,此关键字告诉编译器,该声明的函数可以在本模块或其它模块使用。被extern “C”修饰的变量和函数按照C语言方式编译和链接。
  4. 与extern对应的关键字是static,被static修饰的全局变量和函数只能在本模块中使用。如果一个函数或变量只能在本模块中使用时,不能用extern “C”修饰。

猜你喜欢

转载自blog.csdn.net/yzhang6_10/article/details/81323605