Fork me on GitHub

强弱符号关系

定义与声明的关系,其实“强弱符号关系”。

谁是强符号,谁是弱符号

函数定义:强符号

函数声明:弱符号

初始化了的全局变量:强符号,我们常将这种称为定义

未初始化的全局变量:弱符号,我们常将这种称为声明

强弱符号的统一规则

①不能允许重复出现同名的强符号,但是允许重复出现有同名的弱符号

在a.c中同时定义两个全局变量int a = 100,编译无法通过。

在a.c中同时定义两个同名函数fun,也编译无法通过

可以对全局变量和函数进行重复声明,因为声明是弱符号,允许同名弱符号重复。以前学C时老师总是讲,声明可以重复,原因就来自于这里。

②有一个强符号,其它都是弱符号的话,只保留强符号,其它弱符号消失

同名符号的作用域以最前面的那个符号为准,正是因为这点原因,放在最前面的声明才能提前作用域。所以声明虽然是弱符号,遇到强符号时消失了,但是它能够提前作用域。

③全都是弱符号的话,只留一个即可,其它全部消失

比如a.c中的两个int g_var2都是弱符号,统一符号时只留其中一个,留哪一个由编译器决定。但是不管留哪一个,作用域范围以最前面的哪一个为准。同一个.c中的强弱符号统一,是在第二阶段编译时由编译器来完成的,而不同.c中的强弱符号统一,则是由第4阶段“链接”来完成的。

posted @ 2018-08-15 23:11  克拉默与矩阵  阅读(1409)  评论(0编辑  收藏  举报