【问题标题】:Include hierarchy confusion包括层次混乱
【发布时间】:2014-12-20 03:43:17
【问题描述】:

我对@9​​87654321@ 指令在C/C++ 中的工作方式感到困惑。我的第一个问题是:

如果标题 A 包含标题 B firstthen 标题 C,那么标题 B 中定义的所有内容是否都可以立即在标题 C 中使用?例如:

/* FILE: header A */

#include "B.h"
#include "C.h" //are stuff from B.h available INSIDE C.h now?

我的第二个问题是(与上面有些相关)这种包含行为在 C 和 C++ 中是否不同?

最后,我正在尝试使用 C++ 编译器编译freeglutfreeglut 的标头具有以下内容:

#ifndef  __FREEGLUT_H__
#define  __FREEGLUT_H__

#include "freeglut_std.h"
#include "freeglut_ext.h"

#endif /* __FREEGLUT_H__ */

问题是,在编译为 C 时,一切都很好,但在 Visual Studio 中切换到 C++ 突然使 freeglut_ext.h 不知道 freeglut_std.h 中定义的所有内容。这是仅限于 MSVC 的问题吗?

【问题讨论】:

  • 第一个问题的答案是“是”

标签: c++ c visual-studio visual-studio-2012 freeglut


【解决方案1】:
C 和 C++ 中的

#include 是纯文本包含,所以您的第一个问题 yes 和您的第二个问题 no。我不知道freeglut,所以我不知道它的标题可能在玩什么#ifdef __cplusplus(或其他)游戏——不知道你会得到什么错误消息来说服你第二个文件是“不知道的”尽管对您陈述的问题的答案很容易,但第一个使得帮助您解决所陈述的问题变得不可行:-)

【讨论】:

  • 嗯,你提出了一个很好的观点,它确实在其标题顶部包含extern C。这些错误只是"freeglut_std.h" 中的#define 标记在"freeglut_ext.h" 中不可用。像这样的错误:GL\freeglut_ext.h(130): error C2144: syntax error : 'void' should be preceded by ';'
【解决方案2】:

这只是对您问题第一部分的回答。

C++ 编译发生在每个单独编译的 .cpp 文件中。单独的标头不是编译过程的一部分,除非您明确地将它们包含在 .cpp 文件中。 #include 指令基本上将标头的所有内容复制到包含它的 .cpp 中。 因此,在一个标头中定义的内容在另一个标头中可用是毫无疑问的。

但是在您的情况下,如果在 B.h 中定义了在 C.h 中引用的名称,则包含顺序必须首先是 B.h,然后是 C.h

【讨论】:

  • 但据我在网上看到的,它应该持续一个编译单元,C编译怎么通过了?
猜你喜欢
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多