c++函数和变量的名称修饰以及强弱符号

读《程序员自我修养》笔记

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值