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,对于函数使用相对寻址;重定位的时候去查全局符号表,对相应的符号进行定位。
- C/C++中几个关键字的理解
- C中重要的几个关键字
- c中restrict关键字的理解
- c语言中restrict关键字的理解
- Object-C中 Self 关键字的理解
- c语言中const 关键字的理解
- C语言中标识符声明的几个关键字总结
- C关键字restrict的理解
- C 语言中32个关键字中几个特殊关键字
- Objective-C几个关键字
- C语言中对volatile关键字的理解
- C语言中extern关键字的使用和理解
- c语言中关键字 static 的相关理解
- C语言的关键字有几个
- 几个关键字的理解
- c const关键字理解
- c static关键字理解
- C语言的static关键字的理解
- 使用fedora的问题
- 数据库设计中的14个关键技巧
- 通过命令行安装silverlight4
- JS 获取上传文件大小
- TIMESTEN安装配置指南-中文版
- C/C++中几个关键字的理解
- DB2远程链接常用命令
- 变量初始化问题
- 学习C语言及GTK界面编程经典实例修改: 计算器
- 第七章 内存管理(常见内存错误,指针数组的比较)
- jquery ajax 缓存问题
- window mobile 开发常见问题
- 会计文本替代ZRGGBS000
- ASQLite3UpdateSQL 解析UpdateSQL中的BUG