让我们先来看一个例子。
在下面的工程中,共有三个文件:main.cpp、func.cpp、var.h。
其中var.h中定义了一个int型的变量:
1 //var.h 2 3 #ifndef __VAR_H_ 4 #define __VAR_H_ 5 6 int var = 10; 7 8 #endif
在func中定义了一个函数,返回刚才定义的var变量:
1 //func.cpp 2 3 #include "var.h" 4 5 int func(void) 6 { 7 return var; 8 }
最后是main.c,在main函数中调用func函数
1 //main.cpp 2 #include <stdio.h> 3 #include "var.h" 4 5 int func(void); 6 7 int main(void) 8 { 9 int i = func(); 10 }
接着编译,链接。编译时不会有错误,但是链接时会报错。在VC6中提示错误如下:
func.obj : error LNK2005: "int var" (?var@@3HA) already defined in main.obj
Debug/temp.exe : fatal error LNK1169: one or more multiply defined symbols found
这是一个常见的错误。这里
但是有时候,确实把一些全局变量定义在一个头文件里会比较方便。下面介绍一个常见的方法:
1 //global.h 2 #ifdef GLOBAL_VARIABLES_HERE 3 #undef EXTERN 4 #define EXTERN 5 #endif 6 7 //下面是全局变量的定义 8 //前面加上EXTERN修饰 9 10 EXTERN int var;
这样,在global.cpp中通过定义GLOBAL_VARIABLES_HERE宏,能够将EXTERN展开成空宏。而其它地方(一般在重要的头文件里):
1 #define EXTERN extern
这样就可以了