菜鸟提问--一个让我晕头转向的问题
先来说下文件结构
我使用VC6建立了一个工程,包含以下三个文件:
A.H B.CPP C.CPP(C.CPP就是main函数所在的文件)
我在A.H中定义了一个全局变量 int test = 0;
然后在B.CPP和C.CPP中都#include "A.H " ,再编译,居然通过了,请问为什么?
按照我的思路,在B和C中都加入了A.H之后,编译器会把A.H中的内容加入B和C中,这样,B和C中都会出现int test = 0;这样是不是就重复定义了test这个变量了(B和C中都出现了这样的定义)?应该是不允许的啊?
而这样做编译器就会提示报错:
直接在B.cpp和C.cpp中都定义一个int y = 0; 编译器就会提示 y在xx.obj中已经定义了
PS:
我这个问题是看书上谈到C++中const类型对象的链接性时想到的。
书上介绍const类型的对象链接性是内部的,就像static类型似的。所以这样才能在头文件中定义const类型的常量,然后让所有的cpp去include它,然后每个cpp就都有了自己的一套常量定义,它们的值是一样的,但是却不是指向同一对象。
我就在想,int x = 0 这样的语句可以定义一个全局变量,说明这种变量的链接性应该是外部的。结果一试,居然可以编译通过,我晕!
恳请诸位大牛介绍
[解决办法]
#ifdef TEST_H
#define TEST_H
...
#endif
只是为了防止重复包含,例如B.h包含A.h,B.cpp包含B.h和A.h;
如果不加#ifdef。。。 嗯??
应该是#ifndef ××× #define ××× #endif;
就会出现重定义错误。。。。
上面所说的:
而使用这个头文件的有x.cpp y.cpp z.cpp,难道会因为 把该头文件中的内容加入了x.cpp并编译了x.cpp,就导致y.cpp z.cpp都无法再使用这个头文件了?
x.cpp ,y.cpp, z.cpp是在不同编译单元分别编译的,即使在x.cpp中编译了以后,还会在y.cpp,z.cpp中编译(因为他们是独立进行的)。(参考孙鑫《vc++深入详解》)
[解决办法]
楼主已经加了防止重复包含的语句,当然能通过编译了,不过应该是#ifndef,你写错了吧
[解决办法]
所谓负负得正,你的头文件哨兵写错了,导致它在两个CPP文件中都没有生效,当然没有重复定义!
如果你尝试输出变量test, 编译器一定报该变量未定义的错误