C++ extern“C“详谈

        C++语言在编译的时候为了解决函数的多态问题,建立了与C语言编译器不同的函数名修饰规则,C++语言在编译的时候会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接阶段无法找到对应函数的情况。因此,C函数就需要用extern “C”进行链接指定,通知编译器以下函数或文件中函数是C语言函数,编译时按照C语言编译器的函数名修饰规则,保持函数的名称,不回生成用于链接的中间函数名。

C语言编译器的函数名修饰规则

        对于__stdcall调用约定,编译器和链接器会在输出函数名前加上一个下划线前缀,函数名后面加上一个“@”符号和其參数的字节数。比如 :_functionname@number。

int add(char a,char b);

C语言编译器修饰后的名称为

_add@2

C++语言编译器的函数名修饰规则

        C语言编译器的函数名修饰规则仅仅使用函数名对不同函数进行区分,不同重载函数会出现修饰输出名称一致的情况,为了解决函数的多态问题,C++语言编译器建立了一套更加复杂的函数名修饰规则,但信息更充分,通过分析修饰名不仅可以知道函数的调用方式。返回值类型,參数个数甚至參数类型。

对于__stdcall方式,参数表的开始标识是“@@YG”,参数表的拼写代号如下表所示:

参数表的拼写代号表
X--voidD--char
E--unsigned charF--short
H--intI--unsigned int
J--longK--unsigned long
M--floatN--double
_N--boolU--struct
PA--指针PB--const 指针...

详见编译器的函数名修饰 - 豆丁网

int show(char *var1,unsigned long);

C++语言编译器修饰后的名称为

?show@@YGHPADK@Z

此外,extern"C"是C++的语法,通常我们写一个头文件时,并不确定是在C或C++编译器环境下使用,如果在C语言编译器下使用extern"C"时,编译器会报错。因此,使用extern"C"需要进行编译器进行检查:

#ifdef __cpluscplus  
extern "C" {  
#endif  
  
//some code  
  
#ifdef __cplusplus  
}  
#endif  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值