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

初学者提问-一个让小弟我晕头转向的有关问题

2012-03-31 
菜鸟提问--一个让我晕头转向的问题先来说下文件结构我使用VC6建立了一个工程,包含以下三个文件:A.HB.CPPC.

菜鸟提问--一个让我晕头转向的问题
先来说下文件结构

我使用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, 编译器一定报该变量未定义的错误

热点排行