C++之extern的详细介绍,第1张

C++之extern的详细介绍,第2张

经常看到这段代码:
以下是引用:
# ifdef _ _ cplusplus
extern " c " {
# endif
/一段代码
# ifdef _ _ cplusplus[

这个代码到底是什么意思?首先,__cplusplus是cpp中的自定义宏。如果定义了这个宏,就意味着它是一段cpp代码。换句话说,上面这段代码的意思是:如果是一段cpp代码,那么加入extern“C”{ and }来处理代码。

为了理解为什么使用extern“C ”,我们必须从cpp中的函数重载开始。在c++中,为了支持重载机制,在编译后的汇编代码中,要对函数的名字进行处理,比如函数的返回类型等。然而在C中,它只是一个简单的函数名,不会添加任何其他信息。也就是说,C++和C对生成的函数名的处理是不同的。

比如下面这个简单的函数,我们来看看添加或者不添加extern“C”产生的汇编代码的变化:
下面是一个引号片段:
int f(void)
{
RETURN 1;
}

添加extern“C”时生成的汇编代码是:
以下是引号片段:
。文件“test . cxx”
。文本
。align2
。globl _ f
。def _。SCL 2;。32型;。endef
_ f:
pushl % ebp
movl % esp,%ebp
movl ,%eax
popl %ebp
ret

但是在extern“C”没有加
之后,下面是加引号的片段:
。文件“test . cxx”
。文本
。align2
。globl _ _ z1fv
。def _ _。SCL 2;。32型;。endef
_ _ Z1fv:
pushl % ebp
movl % esp,%ebp
movl ,%eax
popl %ebp
ret

两段汇编代码也是用gcc -S命令生成的,所有地方都一样,除了生成的函数名,一个是_f,一个是__Z1fv。

为了理解添加或不添加extern“C”对函数名的影响,我们继续我们的讨论:为什么我们需要使用extern“C”?C++之父在设计C++的时候,考虑到当时已经有大量的C代码存在。为了支持原C代码和编写的C库,需要在C++中尽可能地支持C,extern“C”就是策略之一。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++之extern的详细介绍

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情