标签:完成 出现 关系 c中 全局 提前 编译器 函数声明 有一个
定义与声明的关系,其实“强弱符号关系”。
谁是强符号,谁是弱符号
函数定义:强符号
函数声明:弱符号
初始化了的全局变量:强符号,我们常将这种称为定义
未初始化的全局变量:弱符号,我们常将这种称为声明
强弱符号的统一规则
①不能允许重复出现同名的强符号,但是允许重复出现有同名的弱符号
在a.c中同时定义两个全局变量int a = 100,编译无法通过。
在a.c中同时定义两个同名函数fun,也编译无法通过
可以对全局变量和函数进行重复声明,因为声明是弱符号,允许同名弱符号重复。以前学C时老师总是讲,声明可以重复,原因就来自于这里。
②有一个强符号,其它都是弱符号的话,只保留强符号,其它弱符号消失
同名符号的作用域以最前面的那个符号为准,正是因为这点原因,放在最前面的声明才能提前作用域。所以声明虽然是弱符号,遇到强符号时消失了,但是它能够提前作用域。
③全都是弱符号的话,只留一个即可,其它全部消失
比如a.c中的两个int g_var2都是弱符号,统一符号时只留其中一个,留哪一个由编译器决定。但是不管留哪一个,作用域范围以最前面的哪一个为准。同一个.c中的强弱符号统一,是在第二阶段编译时由编译器来完成的,而不同.c中的强弱符号统一,则是由第4阶段“链接”来完成的。
标签:完成 出现 关系 c中 全局 提前 编译器 函数声明 有一个
原文地址:https://www.cnblogs.com/kelamoyujuzhen/p/9484648.html