shongshi
随笔 - 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
五味杂陈
阅读(314)
评论(0)
编辑
收藏
引用
所属分类:
C++
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
Powered by:
C++博客
Copyright © 五味杂陈
导航
C++博客
首页
新随笔
联系
聚合
管理
<
2009年4月
>
日
一
二
三
四
五
六
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
.NET(3)
(rss)
C++(1)
(rss)
Oracle(7)
(rss)
设计模式(1)
(rss)
心情随笔(2)
(rss)
随笔档案
2009年7月 (2)
2009年6月 (3)
2009年5月 (3)
2009年4月 (5)
搜索
最新评论
1. re: oracle em如何登录orcl以外的数据库?[未登录]
check file "portlist.ini"
--eric
2. re: 不知道C++为什么要引入虚拟继承和多继承
我也觉得没有逻辑
--welld_djj
3. re: .net中装箱的几种情况
高!
--亨德列克
阅读排行榜
1. Oracle忘记密码怎么办?(2254)
2. C#中的继承与覆盖(1753)
3. .net中装箱的几种情况(1713)
4. Equals方法的实现(参见《Microsoft.net框架程序设计》并提出少许建议)(1504)
5. oracle em如何登录orcl以外的数据库?(1394)
评论排行榜
1. 不知道C++为什么要引入虚拟继承和多继承(1)
2. .net中装箱的几种情况(1)
3. oracle em如何登录orcl以外的数据库?(1)
4. oracle em中设置首选身份证明(0)
5. 要学习Oracle了(0)