本文主要是介绍全局变量不能定义在“被多个.c文件引用的.h文件”中,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
转自: https://blog.csdn.net/basstal/article/details/52275191
全局变量global定义在头文件中,因为所有定义预设为外部链接,所以在头文件被.c文件包含以后,等于有两个或更多同等定义的global存在于不同的翻译单元,编译器发现不了错误,因为编译器每次是以翻译单元运作的。但是,链接器会在解析交叉引用时报告“符号被多重定义”错误。
//DefineGlobal.h
int global;
//GlobalTest1.c
#include "DefineGlobal.h"
//GlobalTest2.c
#include "DefineGlobal.h"
E:\cpp\牛客网>g++ -std=c++11 DefineGlobal.h GlobalTest1.c GlobalTest2.c
C:\Users\\AppData\Local\Temp\ccseJhV1.o:GlobalTest2.c:(.bss+0x0): multiple definition of `global'
C:\Users\\AppData\Local\Temp\cccqfbA0.o:GlobalTest1.c:(.bss+0x0): first defined here
- 当把(所谓的)全局变量global定义为static时,由于static使定义的变量称为内部链接,所以在各个.c文件中,存在多个同名global但不同等的定义,每个翻译单元中的global维持自己的内存区域,此时链接器不会报告“符号被多重定义”错误。
//DefineGlobal.h
#ifndef DEFINEGLOBAL_H
#define DEFINEGLOBAL_Hstatic int global;#endif
//GlobalTest1.c
#include <iostream>
#include "DefineGlobal.h"void print1()
{global = 1;std::cout<<"print1 : "<<global<<std::endl;
}
//GlobalTest2.c
#include <iostream>
#include "DefineGlobal.h"void print2()
{std::cout<<"print2 : "<<global<<std::endl;global = 2;std::cout<<"print2 : "<<global<<std::endl;}
//GlobalMain.c
extern void print1();
extern void print2();int main()
{print1();print2();return 0;
}
//输出
print1 : 1
print2 : 0
print2 : 2
- 此时,(所谓的)全局变量并没有达到一般意义上全局变量的效果,相当于每个翻译单元的局部变量。
结论:
全局变量不能定义在被多个.c文件包含的头文件中
在某.c文件中声明的全局变量需要在其他.c文件中使用时,可以使用extern关键字。
这篇关于全局变量不能定义在“被多个.c文件引用的.h文件”中的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!