extern "C"小结

来源:互联网 发布:淘宝无线端首页psd 编辑:程序博客网 时间:2024/05/17 23:51
 可以在C++中使用C的已编译好的函数模块,在c++中么用到c语言写的函数,声明一下,在DLL中经常看到,避免C++ name mangling,主要用于动态链接库

,使得导出函数名称与C语言规则一致(不改变),方便不同的编译器甚至是不同的开发语言调用。
extern "C"是告诉C++编译器以C Linkage方式编译,也就是抑制C++的name mangling机制。例如:
void Test(void);
C++编译器可能实际把它改名为vTest_v,C++的重载/namespace等机制就是这样来的。而
extern "C" void Test(void)
则和C编译器一样为_Test。
主要用与在C++代码中调用的C函数的声明,或C++中编译的函数要在C中调用。

所以,可以用一句话概括extern“C”这个声明的真实目的(任何语言中的任何语法特性的诞生都不是随意而为的,来源于真实世界的需求驱动。我们

在思考问题时,不能只停留在这个语言是怎么做的,还要问一问它为什么要这么做,动机是什么,这样我们可以更深入地理解许多问题):   实现

C++与C及其它语言的混合编程。


C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对

应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。
下面是一个标准的写法:
//在.h文件的头上
#ifdef __cplusplus
extern "C"{
#endif

 …
 …
 //.h文件结束的地方
#ifdef __cplusplus
}
#endif

如果C++调用一个C语言编写的.DLL时,当包括.DLL的头文件或声明接口函数时,应加extern "C" { }。
总结 C和C++对函数的处理方式是不同的.extern "C"是使C++能够调用C写的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话,那

么就要使用extern "C"来说明。

 可以这样来试验:头文件如下

test.h

int add( int x, int y );

实现文件test.c

#include "test.h"
int add( int x, int y )
{
 return x + y;
}
/* C实现文件 test.c
/* 这样会编译出错:#include "cExample.h" */
extern int add( int x, int y );

main函数所在文件main.cpp

#include "test.h"

int main( int argc, char* argv[] )
{
 add( 2, 3 );
 return 0;
}

会出错,如果把test.c后缀改为cpp就会通过

否则把头文件改写如下也可以通过:

#ifdef __cplusplus
extern "C" {
#endif

int add( int x, int y );


#ifdef __cplusplus
}
#endif

这里还有一篇不错的文章:http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html


 

原创粉丝点击