多个文件使用同一全局变量(未初始化) 以及局部变量重复定义
2018-01-06 09:29
323 查看
如果是多个文件中同一变量,是由C语言编译器中的linker解决的。
首先,要编译的文件中的符号(函数名,全局变量名)分为weak和strong类型。
weak symbol:未初始化的全局变量
strong symbol:函数名,初始化的全局变量
linker解决按3条规则解决此问题
1,多个相同名称的strong symbol是不被允许的
2,一个strong symbol和多个weak symbol相同,选strong symbol
3,多个weak symbol相同,会任意选一个详细参见CS:APP 7.6.1节,How linkers resolve multiply defined global symbols
///////////////////////////////////////////////////file1.cint b;int b;int b;编译通过不会警告//////////////////////////////////////////////////file2.cint b=1;int b=2;报错,重复定义//////////////////////////////////////////////////
全局变量的处理和局部变量有所不同。全局中未赋初值的变量都被视作声明而非定义,例如
int i;/*对于全局变量而言这些都只是声明一个符号*/
int i;
int i;
int i;
int i;
int i = 6;/*这里分配了空间*/
以上没有任何问题,但是如果有两个地方都赋了初始值就不行了,例如
int i = 6;
int i = 6;
这就会有重复定义的error。
对于函数中的变量,任何不带extern的声明都是定义,即局部变量立刻分配空间,所以
int i;
int i;
也会报错。
首先,要编译的文件中的符号(函数名,全局变量名)分为weak和strong类型。
weak symbol:未初始化的全局变量
strong symbol:函数名,初始化的全局变量
linker解决按3条规则解决此问题
1,多个相同名称的strong symbol是不被允许的
2,一个strong symbol和多个weak symbol相同,选strong symbol
3,多个weak symbol相同,会任意选一个详细参见CS:APP 7.6.1节,How linkers resolve multiply defined global symbols
///////////////////////////////////////////////////file1.cint b;int b;int b;编译通过不会警告//////////////////////////////////////////////////file2.cint b=1;int b=2;报错,重复定义//////////////////////////////////////////////////
全局变量的处理和局部变量有所不同。全局中未赋初值的变量都被视作声明而非定义,例如
int i;/*对于全局变量而言这些都只是声明一个符号*/
int i;
int i;
int i;
int i;
int i = 6;/*这里分配了空间*/
以上没有任何问题,但是如果有两个地方都赋了初始值就不行了,例如
int i = 6;
int i = 6;
这就会有重复定义的error。
对于函数中的变量,任何不带extern的声明都是定义,即局部变量立刻分配空间,所以
int i;
int i;
也会报错。
相关文章推荐
- 全局变量的定义以及函数内怎么使用局部变量和全局变量?
- 在头文件中定义变量以及static变量意味着什么?全局变量要如何正确使用?关键字extern要怎么用?
- 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法!
- extern 用法,全局变量与头文件(重复定义)
- extern 用法,全局变量与头文件(重复定义)
- extern用法,全局变量,全局函数与头文件(重复定义)
- [C语言项目]防止头文件和全局变量重复定义
- C++添加一个头文件和extern以及全局变量和局部变量问题(16.3.19上机的一小题)
- 对“C++添加一个头文件和extern以及全局变量和局部变量问题”的解释
- C++基础之两个头文件使用同一个变量会重复定义怎么办
- extern 用法,全局变量与头文件(重复定义)
- Android 如何定义全局变量 以及 static静态变量使用误区 的问题
- extern 用法,全局变量与头文件(重复定义)
- C++如何定义多个文件使用全局变量
- keil 中——C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法
- 解决多重定义问题/如何声明全局变量让多个cpp文件使用
- extern 用法,全局变量与头文件(重复定义)
- 防止头文件和全局变量重复定义
- python多文件使用同一个全局变量的定义和使用方法
- 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法