您的位置:首页 > 编程语言 > C语言/C++

C语言中的强符号和弱符号(变量篇)

2016-04-02 10:23 826 查看
        很多同学认为未经初始化的变量值是一个随机数,其实不然,C语言中规定:未经初始化的全局变量默认值是0;

那既然默认值都是0,就可以不用初始化了吧?况且初始化后的变量会进入.data段,引起生成的程序文件变大(实际大部分编译器都已经对此做了优化:初始化为0的变量还是放在.bss段,不会放在.data段,)。为什么公司的编程规范中要求全局变量都需要初始化呢?如果要知道原因,只有去问写编程规范的老师了。

这里我只讲一下我的理解,我们先看下下面这段代码,包含两个文件,a.c和b.c,都有一个共同的变量weak_var.

doudou@ubuntu:~/study/weaksymbol$ cat a.c
#include<stdio.h>
int weak_var;
extern int LenOfVar();
int  main(int argc, char* argv[])
{
LenOfVar();
return 0;
}
doudou@ubuntu:~/study/weaksymbol$ cat b.c
#include<stdio.h>
char weak_var;
int LenOfVar()
{
printf("len is = %d\n", sizeof(weak_var));
return 0;
}
doudou@ubuntu:~/study/weaksymbol$ gcc a.c b.c -o a
doudou@ubuntu:~/study/weaksymbol$ ./a
len is = 1
     

       我们可能会惊讶:为什么两位文件中都定义了weak_var变量,但是编译却没有报变量重复的错误呢?这个要从C语言的强符号和弱符号说起。C语言中规定,未经初始的全局变量是弱符号;编译器对于强弱符号的处理原则:

1、如果一个程序中出现2个以上强符号,则编译器会提示变量重复的错误;

2、如果一个程序中只有1个强符号,N个弱符号,则所有的弱符号不起效;

3、如果一个程序中没有强符号,只有弱符号,则由编译器随机选择,取决于编译器的策略。

        有了上面3个原则,我想大家都明白怎么回事了,那要解决这个问题怎么办呢?建议的方法:

1、全局变量全部初始化,把问题提前暴露出来,防止程序后面出现与设计者初衷相悖的现象,这种问题很难定位。

2、减少文件中的全局变量引用;多用static修饰。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: