0

.h 文件可以在不包含的情况下查看彼此的内容吗?我知道当我在没有#include“myfile.h”的情况下使用其他.h文件中的.h文件中的变量之前,我用C编程。我正在尝试在 C++ 中做同样的事情,但我不断收到“定义超出范围错误”

4

4 回答 4

2

不是直接的。但是,如果.ccor .cfile#include是 sa 文件,那么#include它后面的任何 headers d都会看到该 header 的内容。原因是它的#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(或之后的任何标题#included 中)看到错误。

但我认为这不能完全回答您的问题,因为仅此过程不应导致任何“定义超出范围”错误。愿意发布有问题的代码示例吗?

于 2009-11-17T00:18:13.413 回答
0

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

于 2009-11-17T00:18:20.290 回答
0

不,在 C 或 C++ 中都没有。经常会间接包含标题,这可能在您之前的经验中发生过。

于 2009-11-17T00:18:47.640 回答
0

在 C 和 C++ 中,除非它被加载到编译单元(通常是 .c 或 .cpp 文件)中,或者如果它被显式声明,否则没有任何东西是可见的。

您可以使用“extern”转发声明变量

extern int somewhere_else; // now the somewhere_else defined elsewhere can be seen here

较旧的 C 编译器可能对前向声明的需求更为宽松。

于 2009-11-17T00:19:34.237 回答