C语言中的强符号和弱符号(变量篇)
2016-04-02 10:23
826 查看
很多同学认为未经初始化的变量值是一个随机数,其实不然,C语言中规定:未经初始化的全局变量默认值是0;
那既然默认值都是0,就可以不用初始化了吧?况且初始化后的变量会进入.data段,引起生成的程序文件变大(实际大部分编译器都已经对此做了优化:初始化为0的变量还是放在.bss段,不会放在.data段,)。为什么公司的编程规范中要求全局变量都需要初始化呢?如果要知道原因,只有去问写编程规范的老师了。
这里我只讲一下我的理解,我们先看下下面这段代码,包含两个文件,a.c和b.c,都有一个共同的变量weak_var.
我们可能会惊讶:为什么两位文件中都定义了weak_var变量,但是编译却没有报变量重复的错误呢?这个要从C语言的强符号和弱符号说起。C语言中规定,未经初始的全局变量是弱符号;编译器对于强弱符号的处理原则:
1、如果一个程序中出现2个以上强符号,则编译器会提示变量重复的错误;
2、如果一个程序中只有1个强符号,N个弱符号,则所有的弱符号不起效;
3、如果一个程序中没有强符号,只有弱符号,则由编译器随机选择,取决于编译器的策略。
有了上面3个原则,我想大家都明白怎么回事了,那要解决这个问题怎么办呢?建议的方法:
1、全局变量全部初始化,把问题提前暴露出来,防止程序后面出现与设计者初衷相悖的现象,这种问题很难定位。
2、减少文件中的全局变量引用;多用static修饰。
那既然默认值都是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修饰。
相关文章推荐
- 第1周 C语言及程序设计初步 例程-6 用循环累加
- 一起talk C栗子吧(第一百三十五回:C语言实例--exec系列函数一)
- c++ 复数类
- 【笔试/面试】—— 奇葩 C/C++ 语法题
- C++类静态成员的使用
- C++开源库
- c++面试题
- C++智能指针与返回局部指针测试
- 第十七章,txt文件的写入和读取数据结合练习(C++)
- C++中const用法总结
- CSP考试 2014年12月第2题 Z字形扫描 C语言实现
- 如何实现函数来处理可变参数
- 扩展Python__在python脚本中使用其他语言(c/c++/java/c#)编写的模块
- c++中的动态内存管理
- c++第2次上机作业
- 理解C语言中指针的声明以及复杂声明的语法
- C++混合编程之idlcpp教程Python篇(4)
- C++作业2
- 静态链表与动态链表(C语言实现)
- C++上机报告2