头文件中定义全局变量会出现的问题
直接在头文件中定义全局变量,然后有多个文件包含这个头文件时,编译通过不了,提示重复定义变量!
在头文件中定义全局变量时前面加上关键字static,此时编译会通过但是此时全局变量的作用域不是我们想要的结果!
测试:
/* 再头文件中定义一个全局变量 */
static int a = 0;
/* 然后在两个包含了此头文件的C文件中分别打印这个变量的地址 */
printf("&a = %x\n", (uint)&a);
测试结果你会发现 两个地址不一样 !!原因是它在每个源文件中都有一份这个变量的拷贝,而不是共用一个变量。它的作用域只在一个源文件中,而不是我们想要的跨文件的全局变量。
怎样得到真正的全局变量?
在其中一个源文件中定义一个全局变量
在其他源文件中使用 extern 声明此变量,就可以使用了
或者在 头文件 中使用 extern 声明此变量,然后在需要使用这个变量的源文件中包含此头文件
例如:
/* 在其中一个源文件中定义一个全局变量 */
int a = 0;
/* 在其他源文件或者头文件中使用 extern
声明此变量 */
extern int a;
特别注意 结构体变量
在GCC编译环境下,在头文件中直接定义全局结构体变量是可以的。编译时不会报错,而且它在所有包含这个头文件的源文件中共用一个变量。
而在windows中的VS编译环境下,不能直接在头文件中定义全局结构体变量,会和普通变量一样报错,提示重复定义变量!
/* 在头文件中定义一个全局结构体变量 */
struct test{
int a;
char b;
};
struct test test_1;
注:这些结果都是我亲自动手测试过的
所使用的GCC版本:gcc version 4.8.2
所使用的VS版本:VS2010
所以建议不要在头文件中定义任何变量