extern "C"{}的作用就是说明这在{}范围之内说明的函数是按c,或者需要按c标准来编译。可以从声明调用二个方面来描述它的作用:
1.声明
以下c++代码:
extern "C" { void test() }
void test()
{
// do test
}
表示希望编译器使用c标准来编译test函数。而在c语言中不支持extern "C"。
2.c++代码调用c代码
extern "C" { void test() //test()是c代码或者或者说明是按c标准编译的代码 }
int main()
{
test();
}
无论test函数是c写的还是c++写的,只要它是按c标准编译的,就需要加上extern "C" 声明
3.c调用c++代码
c要调用c++代码,在c++代码中必须以extern "C" 来声明函数,如上文1所示。以下是c代码
void test();
int main()
{
test();
}
例如:
#ifdef __cplusplus /* __cplusplus 表示是C++程序 */
extern "C" { //这是什么意思 ?????????????
#endif /* __cplusplus */
表示如果现在的编译环境是C++的话,让编译器生成C样式的函数名,也就是阻止编译器使用C++的方法进行函数名解析。
C++中因为函数可以重载:
int a(char)
int a(int)
int a(double)...
所以,在编译后的代码里,三个a()是不同的函数名如a_char_xxx,a_in_xxx,a_double_xxx等等.
要去掉后面的一大串符号只要在a()前面加上exter "C"即可
在DLL的对外接口函数中,必须用exter "C" 限制,否则,外部调用者根本不知道你的真正函数名.
1 VC6.0编译器可以按C++或C生成目标函数. 两者生成的目标符号表
并不一样. C方式是与原来标准C相兼容.
2 在DLL中的接口函数一般应按C方式编译而成. extern "C" 就是强
制指定. 如果不按这种方式指定.GetProcAddress(...)取出来的
就不对. 只能隐式连接.
extern "c" 的作用就是使得函数的定义名称和导出名称一致