.h 文件可以在不包含的情况下查看彼此的内容吗?我知道当我在没有#include“myfile.h”的情况下使用其他.h文件中的.h文件中的变量之前,我用C编程。我正在尝试在 C++ 中做同样的事情,但我不断收到“定义超出范围错误”
4 回答
不是直接的。但是,如果.cc
or .c
file#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
(或之后的任何标题#include
d 中)看到错误。
但我认为这不能完全回答您的问题,因为仅此过程不应导致任何“定义超出范围”错误。愿意发布有问题的代码示例吗?
.h 文件中的变量是一种不稳定的情况,因为当您#include
使用头文件时,它只是粘贴到您的源文件中。因此,如果您int j;
在头文件中包含它并从其他源文件中包含它,那么您基本上只是定义了几个不同的变量,称为j
,这当然是一个错误。
不,在 C 或 C++ 中都没有。经常会间接包含标题,这可能在您之前的经验中发生过。
在 C 和 C++ 中,除非它被加载到编译单元(通常是 .c 或 .cpp 文件)中,或者如果它被显式声明,否则没有任何东西是可见的。
您可以使用“extern”转发声明变量
extern int somewhere_else; // now the somewhere_else defined elsewhere can be seen here
较旧的 C 编译器可能对前向声明的需求更为宽松。