我对#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 ++编译器编译freeglut
,freeglut
的标头包含以下内容:
#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吗?
答案 0 :(得分:2)
#include
是纯文本包含,因此是代表您的第一个问题,否代表您的第二个问题。我不知道freeglut
所以我无法分辨它的标题可能正在播放的#ifdef __cplusplus
(或其他)游戏 - 不知道你用什么错误消息来说服你第二个文件“没有意识到”第一个让你无法帮助解决你陈述的问题,尽管你提出的问题答案很简单: - )
答案 1 :(得分:0)
这只是对问题第一部分的回答。
C ++编译会在每个单独编译的.cpp文件中发生。除非您明确地将它们包含在.cpp文件中,否则标题不是编译过程的一部分。 #include指令基本上将标头的所有内容复制到包含它的.cpp中。 因此,在一个标题中定义的内容在另一个标题中可用是毫无疑问的。
但是在你的情况下,如果在B.h中定义的名称在C.h中被引用,那么包含顺序必须首先是B.h然后是C.h