随笔 - 13, 文章 - 0, 评论 - 3, 引用 - 0
数据加载中……

关于extern "C"

用C++进行开发,尤其涉及到开发dll模块时,我们发现头文件中经常定义为

#ifdef __cplusplus
extern "C"
{
#endif



#ifdef __cplusplus
}
;
#endif






这样做有什么好处呢?

我们知道,C++会对函数内部命名,比如说void f(int x,int y),如果通过C编译器编译,则生成的函数名字为f,如果通过C++编译器编译,则内部函数名会改编,例如 @@f@_int@int...(只是便于举例),所以,如果用c++编译的dll,在C中无法调用,因为找不到对应的函数。
为了解决该问题,于是引入extern “C”,这样C++编译器在碰到extern “C”声明的函数时,会采用C编译方式编译。这样编译后的dll,无论在C中还是C++中均可以使用。不过因为C不对函数名字进行改编,所以无法支持函数重载。此外,如果需要导出类,则也没法声明为extern "C",因为C语言中不支持类,导出类的时候extern “C” 无意义。

说到这,提一下后缀名如何影响编译,如果后缀名为cpp,在不加extern “C”的情况下采取c++编译方式,名字会改编,如果后缀名为c,则采取c编译方式。
经常有人问,C++调用C文件时,为什么老是编译和连接出错?这个问题也在于编译方式不同,函数名字不同,找不到对应的函数,所以出错了。所以,C++中要引入c编译的模块,记得在对应的头文件中加入上述代码就可以了。

posted on 2009-04-12 01:18 五味杂陈 阅读(305) 评论(0)  编辑 收藏 引用 所属分类: C++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理