extern "C"

大家在学习C语言或C++时一定都学过extern关键字,它是用来声明一个函数或变量在本模块和其他模块中皆可用。除此之外,还可以进行链接指定。也就是说,当编译器编译时遇到了,不会立即报错,而是在链接阶段到目标模块找到。

虽然说C++和C有许多相似的地方,但C++毕竟还是面向对象的语言,它支持函数重载,而C则不支持。细节上体现在编译后在函数库中保存的名字不同,同一个函数名C++会在名字后面加上变量的类型标志加以区分,如_name_int_int。

同理,C++还支持类成员变量和全局变量。当这些变量同名时,编译器处理的方式和处理函数的方式类似,总之每个变量都会取一个特定的名称用于编译。

为了实现C++和C,甚至是和其他语言混合编程,当C++需要调用C语言代码时,就需要在前面加上extern "C"。

在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。

如果想要看一下具体实现过程,可以考虑看看汇编代码,会直白地表现出来。

比如下面的一段简单的函数,我们看看加入和不加入extern "C"产生的汇编代码都有哪些变化:
int f(void)
{
return 1;
}
在加入extern "C"的时候产生的汇编代码是:
.file "test.cxx"
.text
.align 2
.globl _f
.def _f; .scl 2; .type 32; .endef
_f:
pushl %ebp
movl %esp, %ebp
movl $1, %eax
popl %ebp
ret
但是不加入了extern "C"之后
.file "test.cxx"
.text
.align 2
.globl __Z1fv
.def __Z1fv; .scl 2; .type 32; .endef
__Z1fv:
pushl %ebp
movl %esp, %ebp
movl $1, %eax
popl %ebp
ret
两段汇编代码同样都是使用gcc -S命令产生的,所有的地方都是一样的,唯独是产生的函数名,一个是_f,一个是__Z1fv。

在此,给我们的C++之父鼓个掌,在创造C++时便考虑到了处理原有的大量的C代码的问题,可谓非常善解人意。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值