C ++头文件简单的问题

时间:2009-11-17 00:13:50

标签: c++ scope header-files

.h文件可以看到彼此之间的内容而不包括在内吗?我知道当我在C中编程之前我可以使用其他.h文件的.h文件中的变量而没有#include“myfile.h”。我试图在C ++中做同样的事情,并且我一直在“定义超出范围错误”

4 个答案:

答案 0 :(得分:2)

不直接。但是,如果.cc.c文件#include是一个文件,那么之后的所有标题#include看到该标题的内容。原因是#include的行为类似于复制和粘贴:每个文件内容都有效地转储到一个大文件中,编译器只能看到组合结果。例如,如果你有:

foo.cc:

#include <a.h>
#include <b.h>
#include <c.h>

// foo.cc's contents

即使b.h没有#include a.h,它的定义仍然在bh中可见,因为编译器看到所有标题的内容就好像它们一样foo.cc的一部分。这在实践中可能相当成问题,因为程序依赖于它们未明确包括的定义。当有人更改a.h时,您可以开始在b.h(或之后的任何标题#include d)中看到错误。

但我不认为这完全回答了你的问题,因为单独这个过程不应该导致任何“定义超出范围”的错误。小心发布有问题的代码示例?

答案 1 :(得分:0)

.h文件中的变量是一种不稳定的情况,因为当你#include一个头文件时,它只是粘贴到你的源文件中。因此,如果您在头文件中有int j;并将其包含在其他源文件中,那么您基本上只定义了几个名为j的不同变量,这当然是一个错误。

答案 2 :(得分:0)

不,在C或C ++中都没有。通常情况下,标题是间接包含的,这可能是您以前的经历中发生的。

答案 3 :(得分:0)

在C和C ++中,除非将其加载到已编译的单元(通常是.c或.cpp文件)中,或者显式声明它,否则任何内容都不可见。

您可以使用“extern”

转发声明变量
extern int somewhere_else; // now the somewhere_else defined elsewhere can be seen here

较早的C编译器可能对前向声明的需要更加宽容。