extern “C”的作用如下:
核心作用:实现C和C++的混合编程。extern “C”提供一个链接交换指定符号,用于告诉C++这段函数是C函数,extern “C”后面的函数不使用C++的名字修饰,而是使用C。
C++支持函数重载,C不支持函数重载。函数被C++编译后在库中的名字与C语言不同。如void add(int a, int b),该函数在C编译器编译后,库中名字为_add,而C++编译器则会生成add_int_int的名字。故C++提供C链接交换指定符号extern “C”来解决名字匹配> 问题。
被extern “C”限定的函数或变量是extern类型,extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,此关键字告诉编译器,该声明的函数可以在本模块或其它模块使用。被extern “C”修饰的变量和函数按照C语言方式编译和链接。
与extern对应的关键字是static,被static修饰的全局变量和函数只能在本模块中使用。如果一个函数或变量只能在本模块中使用时,不能用extern “C”修饰。
#include <iostream>
using namespace std;
int main(void)
{
cout << "__FILE__:" << __FILE__ << endl;//当前的文件名(绝对路径):C:\Users\xxx\source\repos\案例\宏\Source.cpp
cout << "__LINE__:" << __LINE__ << endl;//当前行: 10
cout << "__DATE__:" << __DATE__ << endl;//当前日期:Oct 24 2019
cout << "__TIME__:" << __TIME__ << endl;//当前时间:11:29:59
#ifdef __STDC__
cout << "__STDC__:" << __STDC__ << endl;/* use standard C future */
cout << "__STDC_VERSION__:" << __STDC_VERSION__ << endl;
#else
/* use extend C future */ //因为当前是用c++编译
cout << "不使用标准c" << endl;
#endif // __STDC__
cout << "__cplusplus:" << __cplusplus << endl;//c++的编译器版本:199711
#ifdef __OBJC
cout << "__OBJC__:" << __OBJC__ << endl;//测试是否使用object-c编译器编译还是c编译器编译
#else
cout << "不使用object-c编译器" << endl;
#endif // __OBJC
#ifdef __ASSEMBLER__
cout << "__ASSEMBLER__:"<<__ASSEMBLER__ << endl;//处理汇编时用到
/* 汇编代码 */
#else
cout << "不使用汇编代码" << endl;
#endif
return 0;
}
