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
相关文档:
1 选择new->project->win32 console project;
在这一步的选框上有一个选项是 create dictionary for solution, 我不知道这个具体是什么作用,选了之后会项目出现两层文件夹,比如你创建一个命名为test的项目,会生成test文件夹,test中包含另一个test文件夹,你的项目实际上放在了内层te ......
作者:宋宝华 e-mail:21cnbao@21cn.com
1. 引言
指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:“数组名就是指针”。很幸运,我的大学老 ......
1.2 单元测试的目标和方法
单元测试的目标是什么呢?就是完整检测代码单元的功能逻辑。找出代码单元本身的所有功能逻辑错误,具体来说,就是检测对数据的各种分类是否考虑全面,处理是否正确。单元测试并不是用来代替系统测试、性能测试的,它的目标相当明确,就是检测代码单元本身的功能逻辑错误。
& ......
我们需要一个cdt,这个可以在Eclipse官网下载。
我们需要MinGW——C/C++编译平台,下载后需要安装,同时选中g++、MinGW Make,同时设置环境变量,将%MinGW_HOME%\bin设置到PATH中,然后我们可以通过命令行敲击gcc,看是否有效果。
我们需要gdb——C/C++调试平台,下载后安装,默认到MinGW_ ......