易截截图软件、单文件、免安装、纯绿色、仅160KB

C++中extern “C”详解!!

一直知道在C++中用extern “C” {
}调用C语言,但是不知道为什么,虽然也知道编译器的命名规则,不过没有联想到这个上面,看到这篇文章,才恍然大悟。不过,因为自己一直在linux下使
用C语言,没有使用C++的经验的缘故吧,希望以后能有,这样才能融会贯通。
关键点:函数重载,命名规则
一、C++与C机制编译后,也就在汇编语言阶段,函数名的不同:
时常在cpp的代码之中看到这样的代码:
de>#ifdef __cplusplus
extern
“C
” {
#endif
//一段代码
#ifdef __cplusplus
}
#endif de>
这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码
的含义是:如果这是一段cpp的代码,那么加入extern
“C
“{
和}

理其中的代码。
要明白为何使用extern
“C
“,还得从cpp中对函数的重载处理开始说起。
在c
++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而
在C
中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C
++和C

产生的函数名字的处理是不一样的.
比如下面的一段简单的函数,我们看看加入和不加入extern
“C
“产生的汇编
代码都有哪些变化:
de>int f(void)
{
return 1;
} de>
在加入extern
“C
“的时候,也就是以c的方式产生函数名,产生的汇编代码
是:
de>.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 de>
但是不加入了extern
“C
“之后,也就是以c++的方式产生函数名,产生的
汇编代码是:
de>.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 de>
两段汇编代码同样都是使用gcc
-S命令产生的,所有的地方都是一样的,唯独是产生的函数名,一个是_f,一个是__Z1fv。由于C++具有函数名重载功能,所以在编译阶段在函数名前
加点花@或者其他字符,这样可以保证重载的正确性。
二、实例分析:
明白了加入与不加入extern
“C
&ldqu


相关文档:

C开发中堆和栈的差别

1,栈区(stack)—   由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 例如,声明在函数中的一个局部变量int b;系统自动在栈中为b开辟空间。只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。比如:
char* AllocStrfromStack ......

C/C++数组名与指针区别深层探索

作者:宋宝华 e-mail:21cnbao@21cn.com
1.    引言
指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:“数组名就是指针”。很幸运,我的大学老 ......

about pack and align for C/C++

http://msdn.microsoft.com/en-us/library/2e70t5y1(VS.80).aspx
#pragma
pack(  n  )
n : Valid values are 1, 2, 4, 8, and 16.the
alignment of a member will be on a boundary that is either a multiple of 
n
 or
a multiple of the size of the member
,
whichever is smaller.
......

C/C++单元测试理论精要(二)

1.2 单元测试的目标和方法
    单元测试的目标是什么呢?就是完整检测代码单元的功能逻辑。找出代码单元本身的所有功能逻辑错误,具体来说,就是检测对数据的各种分类是否考虑全面,处理是否正确。单元测试并不是用来代替系统测试、性能测试的,它的目标相当明确,就是检测代码单元本身的功能逻辑错误。
& ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号