头文件为什么不能定义变量
工程名: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定义过了。