vs2010项目有4个文件,文件名和代码如下
global.h
#ifndef _GLEBAL_H_
#define _GLEBAL_H_
int a;
#endif
h1.h
#ifndef _H1_H_
#define _H1_H_
extern int test();
#endif
h1.cpp
#include "global.h"
int test(){
return a;
}
main.cpp
#include "h1.h"
#include "global.h"
int main(){
a = 10;
test();
return 0;
}
然后运行的时候就会出现link2005错误:main.obj : error LNK2005: "int a" (?a@@3HA) 已经在 h1.obj 中定义
经过思考,我推断出编译器是一个cpp文件,对应一个模块obj,各模块分开编译,于是h1.obj,和main.obj在编译的时候都把global.h放在一起组成obj,当链接的时候就出现了全局变量重复定义的问题。
于是我给出了一个很“丑”的解决方案,思路是在cpp文件中定义变量,在h文件中声明变量
于是我添加了一个文件global.cpp
int a;
而global.h改为
#ifndef _GLEBAL_H_
#define _GLEBAL_H_
extern int a;
#endif
问题得到了解决。
但是,这样就觉得很不爽,因为明显代码多写了一遍...cpp中定义一次,h中声明一次,请问各路大神有没有更好的解决方案??