对于C语言来说,编译器默认函数和初始化的全局变量为强符号,未初始化的全局变量为弱符号(C++并没有将未初始化的全局符号视为弱符号)。可以通过GCC的"__ attribute ((weak))"来定义任何一个强符号为弱符号,可以使用nm查看一个目标文件中的符号类型。 attribute__ ((weak))只对链接器有效,对编译器不起作用,编译器不区分强符号和弱符号,只要在一个源文件中定义两个相同的符号,不管它们是强是弱,都会报“重复定义”错误。

  1. 不同的目标文件中不能有同名的强符号,否则不能链接在一起,编译器报"重复定义"错误。
  2. 允许一个强符号和多个弱符号,但定义会选择强符号的。
  3. 当有多个弱符号相同时,默认的,链接器使用第一个找到的符号。
extern int ext;
int weak1;
int strong = 1;
int __attribute__((weak)) weak2 = 2;int main()
{return 0;
}

上面这段程序中,"weak1"和"weak2"是弱符号(C语言),"strong"和"main"是强符号,而"ext"既非强符号也非弱符号,因为它是一个外部变量的引用。

void __attribute__((weak)) f();
int main(void)
{if (f)f();return 0;
}

声明了一个符号f(),属性为weak,但并不定义它,这样,链接器会将此未定义的weak symbol赋值为0,也就是说f()并没有真正被调用,试试看,去掉if条件,肯定core dump!
如果我们在另一个文件中定义函数f,与week.c一起编译链接,那么函数f就会正确的被调用。

C语言 强符号与弱符号相关推荐

  1. 【嵌入式】C语言高级编程-强符号和弱符号(09)

    00. 目录 文章目录 00. 目录 01. weak属性 02. 变量强符号和弱符号 03. 函数强符号和弱符号 04. 弱符号的作用 05. alias属性 06. 附录 01. weak属性 G ...

  2. 新手小心:c语言的强符号和弱符号

    声明:下面的实例全部在linux下尝试,window下未尝试.有兴趣者可以试一下.文章针c初学者. c语言的强符号和弱符号是c初学者经常容易犯错的地方.而且很多时候,特别是多人配合开发的程序,它引起的 ...

  3. C语言中的强符号与弱符号

    注意,强符号和弱符号都是针对定义来说的,不是针对符号的引用. 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号. 对于它们,下列三条规则使用: ① ...

  4. c语言弱符号与函数指针,浅谈C语言中的强符号、弱符号、强引用和弱引用【转】...

    首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样 ...

  5. C语言中的强符号与弱符号(关于变量声明与定义的深入讨论)

    看到一篇介绍C语言强符号与弱符号的文章非常好,转载过来加深印象. 原文地址:http://blog.csdn.net/astrotycoon/article/details/8008629 ===== ...

  6. 【C语言】强符号与弱符号

    目录 一.先说结论 二.当attribute修饰符号的引用/声明时--不做链接 2.1.变量声明 2.2.函数声明 三.链接.o文件 3.1.函数 3.1.1.多个强符号 3.1.2.一个强符号多个弱 ...

  7. 【C语言】强符号和弱符号

    1.强符号.弱符号定义 编译器在编译源程序时,无论你是变量名.函数名,在它眼里,都是一个符号而已,用来表征一个地址.编译器会将这些符号集中,存放到一个叫符号表的 section 中. 那么对于两个.c ...

  8. C语言中的强符号和弱符号

    一.强弱符号 强弱符号针对的是处于同一工程下在不同源文件下定义的全局变量符号,链接器只处理global的符号而不处理local的符号.链接的核心是符号的重定位,在符号引用的地方找到符号定义的地方,包括 ...

  9. 浅谈一下嵌入式中的强符号和弱符号

    __attribute__  是一个编译器指令,其实是 GNU C 的一种机制,本质是一个编译器的指令,在声明的时候可以提供一些属性,在编译阶段起作用,来做多样化的错误检查和高级优化. 用于在 C.C ...

最新文章

  1. 主板支持最大内存查看软件
  2. MySQL数据库 高级查询(一)
  3. .NET笔试题集(二)
  4. 计算机与艺术就业怎样,就业报告:这些艺术类好就业,这些难就业!
  5. 听商业领袖揭秘大数据新动态
  6. Linux文档内容查阅命令总结 - cat,tac,nl,more,less,head,tail,od
  7. 【回归预测】基于matlab GA优化BP回归预测(含优化前的对比)【含Matlab源码 1790期】
  8. [2018.10.15 T3] 数列
  9. Resource_Hacker破解版下载
  10. html css javascript jdk 等离线开发手册
  11. c语言1至100的累乘求和,c语言 累加累乘课件.ppt
  12. WinRAR 破解方法详解
  13. 产品经理如何营销自己
  14. 文墨绘学【书法双师】
  15. 反编译插件jad和jd-jui
  16. 键盘乱码,对键盘和数字均乱码,但数字键打出的还是数字,字母键打出的还是字母,只是乱了的起作用~
  17. 如何编制项目蓝图汇报材料
  18. 37.深度解密三十七:网络营销推广之百度经验营销全过程步骤讲解
  19. 佛说爱情五:镜花和水月
  20. 安装Proteus8.9后出现找不到module或者default文件等问题以及运行仿真后报错显示,例如:Cannot find model file ‘APDS9002A.MDF‘.

热门文章

  1. 升级iOS CocoaPods 版本
  2. 5、TM4的PD7和PF0解锁问题
  3. 外包or外派岗,可以去?
  4. java通过aspose实现文档间格式转换
  5. Vue 设置路由title
  6. 黑马程序员MySQL视频操作代码-P79
  7. 为什么要ReLU激活函数
  8. CSDN文章如何迁移至微信公众号
  9. java堆内存设置_java堆内存设置原理
  10. Web前端开发 icon图标 转 web字体图标