extern “C” 的作用

可以在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中调用。

一、修饰名(Decorated Name)

C/C++程序中的函数在内部是通过修饰名来标识的。修饰名是在函数定义或原型编译阶段由编译器创建字符串。当你在LINK等工具中要指定一个函数名时,会用到修饰名。

1、使用修饰名:

大多数情况下,你不必知道函数的修饰名是什么。连接器等工具通常都能处理函数未修饰的名字。然而,在有些情况下,你可能需要指定函数的修饰名。对于C++重载函数和特定的成员函数(如:构造函数和析构数),必须指定这些函数的修饰名,以便连接器等工具能够匹配名字。同时,也必须在那些引用c或c++函数名的汇编源文件中使用修饰名。

2、查看修饰名:

如果你编译了一个源文件,该源文件中包含了函数定义或原型,你可以获得函数的修饰名形式。

(1)用编译器列表(compiler listing)来查看:

   (a)通过将列表文件类型编译器选项(/FA[c|s]) 设置为下面中的一种,来产生列表文件:Assembly with Machine Code (/FAc); Assembly with Source Code (/FAs); Assembly, Machine Code, and Source (/FAcs).

   (b)在产生的列表文件中,找到包含未经修饰的函数定义的行。

   (c)查找前面一行。PROC NEAR 命令标签前就是函数名经过修饰后的形式。

(2)使用DUMPBIN工具来查看:

在.OBJ或.LIB上运行 DUMPBIN,使用/SYMBOLS选项。在输出中查找未经修饰的函数定义。后面跟着的就是经过修饰的函数名,用圆括号括起来的。

二、替代连接说明:

如果在c++中编写一个程序需要用到c的库,那该如何?

如果这样声明一个c函数:void f(int a,char b);

c++编译器就会将这个名字变成相应的修饰名,

然而,c编译器编译的库的内部函数名(连接器使用)是完全不同的。这样,当c++连接器连接c的函数库时,将会产生内部使用函数不匹配。

故c++中提供了一个通过重载extern关键字来实现的替代连接说明(alternate linkage specification。

extern后跟一个字符串来指定想声明的函数的连接类型,后面是函数声明,

比如:extern "C" void f(int a,char b);

这样,就是告诉编译器是c连接,这样就不会转换函数名了。此例中,编译后的内部函数名是_f。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值