【问题标题】:C++ header files simple questionC++头文件简单问题
【发布时间】:2009-11-17 00:13:50
【问题描述】:

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

【问题讨论】:

标签: c++ scope header-files


【解决方案1】:

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

foo.cc:

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

// foo.cc's contents

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

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

【讨论】:

  • 一点点? #include 完全是复制和粘贴,直到包含文件的最后一行是否有终止换行符。
  • @R. Pate:是的,但它也做一些事情,比如添加 #line 指令,这样编译器就知道它应该在的文件和行。但我同意强调复制和粘贴部分很重要。我会编辑。
  • @R.Pate:有趣的是你应该使用那个例子。在 C++ 中,如果任何非空源文件没有终止换行符 (2.1/1/2),则程序的行为是未定义的。 “源文件”的定义包括通常所说的“头文件”。所以这是它不一定等同于复制和粘贴的一个方面。不过,我想所有或几乎所有预处理器都以这种方式实现它。如果缺少换行符,GCC 会发出警告。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      你可以用“extern”转发声明一个变量

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

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

      【讨论】:

        猜你喜欢
        • 2010-12-29
        • 2011-09-20
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多