一、强弱符号

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

强符号:函数和初始化的全局变量所生成的符号。
弱符号:未初始化的全局变量所生成的符号。

很多情况下写出的代码会出现链接的错误,符号重定义,这是因为在不同的源文件中定义了同名的全局变量并且都进行了初始化。

//a.c
int gdata = 10;
//b.c
int gdata = 20;
#include<stdio.h>
int main(){printf("gdata = %d\n",gdata);return 0;
}


这是很多新手容易犯的错误,若将a.c或b.c中全局变量gdata只初始化一次,则不会出现链接错误,并且会链接成功。那么新的问题是:
(1)出现强符号和弱符号,选择哪一个?
(2)若出现多个同名的强符号,最终怎么选择?
(3)若出现多个同名的弱符号,最终会怎么选择?
显然需要这样的一套规则来约束这些可能存在的问题。

二、强弱符号的使用规则

(1)如果出现多个强符号,最终会出现链接错误即符号的重定义。
(2)如果出现强符号和弱符号,编译器最终会选择强符号。
(3)如果出现多个同名弱符号,编译器最终会选择内存占用量最大的那个符号。

一个有趣的小例子再看强弱符号:

//a.c
int x;
void func(){x = 20;
}
//b.c
#include<stdio.h>
short x = 10;
short y = 10;
extern void func();
int main(){func();printf("x = %d,y = %d\n",x,y);return 0;
}
//试问输出的x和y分别是多少,大家可以自己先想一下,看看自己的答案。

执行结果:

和大家心中的答案是否一致呢?
有很多人会有疑问,为什么y输出的不是10,而是0呢?
源文件是独立进行编译的

//a.c
int x;//弱符号
void func(){x = 20; //往x的内存上写20,写4个字节   编译阶段就完成的
}
//b.c
#include<stdio.h>
short x = 10;//强符号   14 00 00 00最终将y覆盖为0
short y = 10;
extern void func();
int main(){func();//链接的完成选择强符号printf("x = %d,y = %d\n",x,y);return 0;
}

在 gcc中,可以通过__attribute__((weak))来强制定义任何一个符号为弱符号。

C语言中的强符号和弱符号相关推荐

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

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

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

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

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

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

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

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

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

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

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

    对于C语言来说,编译器默认函数和初始化的全局变量为强符号,未初始化的全局变量为弱符号(C++并没有将未初始化的全局符号视为弱符号).可以通过GCC的"__ attribute ((weak) ...

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

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

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

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

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

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

最新文章

  1. 我进公司当Android开发实习生时,初中最差的同学成了我的领导
  2. nike附近门店查询_门店配送的全国服务网络如何快速成功运营?
  3. ModelSim之命令行仿真入门 (step 2)
  4. winRAR 没有右键选项
  5. java反射学习(1):反射的基本操作
  6. 如何编写一个python项目
  7. [Leetcode][第336题][JAVA][回文对][暴力][HashSet][字典树]
  8. 你跟大神程序员的差距,就在这8本内功心法
  9. 标签管理体系之业务应用
  10. 关于simulink中参数传递到工作空间
  11. 关闭win7 透明化效果 aero
  12. mybatis 报错 with invalid types () or values 0. Cause: java.lang.NoSuchMethodException:
  13. 【Java学习笔记】修饰符
  14. IPTV Checker(直播源自动检测工具)
  15. 委托租赁云服务器协议,委托租赁云服务器协议
  16. python生成中文字符画_python实战练手项目---字符画及其原理
  17. Word给公式插入编号和引用
  18. 幼儿园案例经验迁移_2020年幼儿园中班教育笔记 生活经验的迁移
  19. 人力资源管理指南——七个方式来改善团队留存率
  20. 项目管理的五个典型工具

热门文章

  1. 文章学习(一)方法类:利用CNN从专利图像导出设计特征向量
  2. 企业微信发送图片失败
  3. React受控非受控组件详解,PureComponent介绍,Refs, children属性详解
  4. 如何修改别人的神经网络,人工神经网络通过调整
  5. Matlab中计算程序运行时间的几种方法
  6. 安卓市场ASO排名优化机制分析,安卓市场的aso优化
  7. php,ajax -->Uncaught SyntaxError: Unexpected end of JSON input at JSON.parse (<anonymous>)
  8. Cisco Nexus 7000
  9. 申宝理财-指数全天探底回升
  10. 中小学语文在线学习辅导哪家好?优质课程随你挑