extern "C"

在CPP的代码中经常看到这样的一段申明:

#ifdef __cplusplus
extern "C" {
#endif
// Your Code
#ifdef __cplusplus
}
#endif

 

第一行 __cplusplus 是CPP编译器内部定义的宏,所以若这段代码是CPP编译器处理的,那么代码将会被 extern "C" { CODE } 包含起来,编译器对这段代码进行特殊处理;

第二行 extern "C",顾名思义,就是说{CODE}中包含的是一段C语言代码,而非CPP的

 

“知其然,知其所以然” 

为什么要这么区分?看看下面这段代码编译出来的OBJ文件就知道了:

#ifdef __cplusplus
extern "C" {
#endif

void fooA()
{}

#ifdef __cplusplus
}
#endif

void fooB()
{}


 

//注意,要用C++编译器编译此文件
g++ -c test.cpp


然后将生成的目标文件反编译看看C++编译器做了什么

// d: disassembler
objdump -d test.o > log.txt


打开log.txt,我们看到:

test.o:     file format pe-i386


Disassembly of section .text:

00000000 <_fooA>:
   0:	55                   	push   %ebp
   1:	89 e5                	mov    %esp,%ebp
   3:	5d                   	pop    %ebp
   4:	c3                   	ret    

00000005 <__Z4fooBv>:
   5:	55                   	push   %ebp
   6:	89 e5                	mov    %esp,%ebp
   8:	5d                   	pop    %ebp
   9:	c3                   	ret    
   a:	90                   	nop
   b:	90                   	nop


可以发现,被 extern "C" { } 包含的fooA函数名称没有发生变化,但是未被包含的 fooB 名称被处理过了。这里可以解释,extern "C" 申明这是一块 C 语言代码,而 C 和 C++ 一个很重要的区别是后者函数可以重载,因为参数和返回值的不同,同一个函数名可以被使用很多次而不会出现命名冲突,就需要编译器处理一下。

了解更多的信息可以参考这篇博客:

http://blog.csdn.net/chary8088/article/details/7255010

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值