读《程序员自我修养》笔记
c++函数和变量的名称修饰:
注意:局部变量是不会有名称修饰的,只有全局标量和静态标量是有名称修饰的,但是变量的类型没有加入到修饰名称中,所以变量时整形还是double都一样。局部静态变量会把所在的函数名称也添加进去
extern "C"的使用,是将大括号中的内部代码当成c语言代码处理,而不会用到c++的名称修饰,而c语言的名称修饰很简单就是在符号前面添加_
#include "stdio.h"
namespace myname{
int var=42;
}
extern "C" int _ZN6myname3varE;
int main()
{
printf("%d\n",_ZN6myname3varE);
return 0;
}
强符号和弱符号(有些变量可以既不是强符号也不是弱符号,比如extern 引用外部的变量)
如果在多个目标文件中含有相同的名称的全局符号,并且都已经初始化,这个时候这些目标文件链接的时候就会出错。
注意:
对于c/c++编译器来说,编译器默认函数和初始化了的全局变量为强符号,为初始化的全局变量为弱符号。但是可以把任何一个强符号转为弱符号
_attribut__((weak)) weak2=2 这样weak2本来应该是强符号的,现在变成了弱符号
规则:
1.如果有多个名称相同的强符号,会报错
2.如果有一个强符号,多个弱符号,选择强符号
3.如果有多个弱符号,选择空间最大的
总结:在强弱符号选择的时候选择“强大的”
强弱引用:
如果是强引用,引用外部的符号,如果没有找到那个符号,就会出错。
如果是弱引用,链接时没有找到符号不会报错,知识把它当成0或者特殊值
__attribute__ ((weakref)) void foo(); 这个是弱引用
弱符号和弱引用的作用:
弱符号可以被用户定义的强符号覆盖;
程序可以对某些扩展的引用定义为弱引用,这样如果功能模块有的时候该功能就有了,如果功能模块被去掉了,相当于就去掉了该功能但是还是能正常链接的
elf中的调试信息,如果在发布的时候其实可以去掉调试信息,节约空间,通过strip