C/C++中几个关键字的理解

来源:互联网 发布:巫启贤 唱功知乎 编辑:程序博客网 时间:2024/04/26 23:08

昨天看书,久不能寐,手痒嘴贱,想一吐为快

 

extern “C"{}

 

这个关键字的表面意思是说: 下面的{}中的代码都要使用C的编译风格来进行。但是实际并不是如此简单的实现的。因为在C++的编译器中,编译后产生的“修饰过的符号(Decorated Symbol)"跟在C编译器产生的“修饰过的符号(Decorated Symbol)"不相同。所以当C++调用C代码的函数时,编译器丫的就以为这是一个C++函数,所以在修饰的时候按照C++的规则进行修饰;一旦用extern "C"以后,他就按照C的风格进行修饰。这样才能保证可以使用C++程序调用C的一些库函数。如printf

另外,这个东西的用法一般跟#ifdef __cplusplus一起使用, ie:

#ifdef __cplusplus

extern "C"{

#endif

....

....

....

#ifdef __cplusplus

}

#endif

强符号与弱符号
对于编程时重复定义的全局函数,实际上是有强符号和弱符号之分的。对于C/C++的编译器而言,编译器默认函数和初始化了的全局变量时强符号,未初始化的全局变量时弱符号。强符号和弱符号都是针对定义而言的,不是针对引用。可以通过gcc的”__attribute__ ((weak))“定义任何一个强符号为一个弱符号。引用不是任何的强符号,也不是弱符号(因为丫的就不是一个有意义的符号)规则:
1. 不允许强符号多次定义,重复定义,报错
2. 一个文件中是强符号,其他文件中是弱符号,则强符号胜,编译器选择强符号
3. 所有的文件中都是弱符号,那么大个的弱符号取胜。(double>float>int>char)
对应于此,有强引用和弱引用之分,如果在强引用时候没有定义,链接器报错。弱引用可以用__attribute__ ((weakref))来定义,在连接的时候如果没有这个函数或者变量,丫的就用0来代替它。这种做法主要用于库,因为库里面的弱符号可以被用户定义的强符号所覆盖。
静态链接
个人理解,静态链接作用主要是空间地址分配和符号解析与重定位。而核心是符号解析和重定位。在空间地址分配的时候,丫的就把所有的看起来一样的段放到一起,然后连接到一起。在linux下, ELF可执行文件是从0x08048000开始进行分配的。对于undefine的符号,一般的做法是把变量作为VMA为0,对于函数使用相对寻址;重定位的时候去查全局符号表,对相应的符号进行定位。

原创粉丝点击