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

        很多同学认为未经初始化的变量值是一个随机数,其实不然,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修饰。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值