包括层次结构混淆

时间:2014-12-20 03:43:18

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

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

如果标题A包含标题B 第一然后标题C,标题B中定义的所有内容是否在标题C中立即可用? e.g:

/* 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吗?

2 个答案:

答案 0 :(得分:2)

C和C ++中的{p> #include是纯文本包含,因此代表您的第一个问题,代表您的第二个问题。我不知道freeglut所以我无法分辨它的标题可能正在播放的#ifdef __cplusplus(或其他)游戏 - 不知道你用什么错误消息来说服你第二个文件“没有意识到”第一个让你无法帮助解决你陈述的问题,尽管你提出的问题答案很简单: - )

答案 1 :(得分:0)

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

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

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