首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

头文件为什么不能定义变量,该怎么解决

2012-04-23 
头文件为什么不能定义变量工程名:test主程序:test.cpp\\-----------------------------------------------

头文件为什么不能定义变量
工程名:test 
主程序:test.cpp 
\\----------------------------------------------- 
\\test.cpp 
#include "th.h" 

int main() 

  return 0; 

\\------------------------------------------------------ 
\\------------------------------------------------------ 
\\th.h 
#ifndef TH_H 
#define TH_H 

struct test { 
}; 

test A; 

#endif 
\\--------------------------------------------- 
\\--------------------------------------------- 
\\tcpp.cpp 
#include "th.h" 




\\------------------------------------------------- 
运行project,遇到错误 : 
----------------------------------------------- 
--------------------Configuration: test - Win32 Debug-------------------- 
Compiling... 
test.cpp 
tcpp.cpp 
Linking... 
tcpp.obj : error LNK2005: "struct test A" (?A@@3Utest@@A) already defined in test.obj 
Debug/test.exe : fatal error LNK1169: one or more multiply defined symbols found 
Error executing link.exe. 

test.exe - 2 error(s), 0 warning(s) 

----------------------------------------------- 


这到底是什么原因。虽然说我在头文件定义,但我已用预处理了,(不是已经处理头文件多重包含了吗)按道理不会出现这问题 

请大侠们搭救!!!

我知道这是有问题的,不要跟我说不要在头文件定义变量,我也懂的处理,我想知道为什么不能定义变量原理?(一直想不通)请从编译器原理说明? 

是两个cpp文件各自包含了同一个头文件,结果在两个obj里都定义了test?怎么就在两个obj都定义了test呢?  
我觉的遇到第一个Cpp里的“#include"ch.h"” 就把头文件包含进去,但遇到第二个Cpp里的“#include"ch.h"”  
发现已经定义了TH_H就不再包含了。但3楼说,这里出现的错误不是一回事。既然不是这个问题,这个问题又是这么产生的呢?(高手请从编译器角度考虑下)(小弟很急,严重影响后期的学习,比较爱钻牛角尖) 

(代码在VC6.0 ,7.0不能通过) 其他没试过

[解决办法]
定义变量和声明变量的区别在于定义会产生内存分配的操作。
/*module1.h*/
int a = 1; /* 在模块1的.h文件中定义int a */

/*module1.c*/
#include "module1.h" /*在模块1中包含模块1的.h文件*/

/*module2.c*/
#include "module1.h" /*在模块2中包含模块1的.h文件*/

/*module3.c*/
#include "module1.h" /*在模块3中包含模块1的.h文件*/
以上的结果是在模块1、2、3中都定义了整型变量a,a在不同的模块中对应不同的地址单元,因为一旦包含.h,则定义一个a,编译器为之分配内存。换句话说就是这3个a是不同的a!从来就不需要这样的设计,因此编译器会捕捉到这种现象,并告诉你已经有一个a定义过了。

热点排行