我有一个“Common.h”文件,其中存储了在我的项目中重复使用的所有字符串。
namespace Common{
static const std::string mystring = "IamAwesum";
}
因此,在任何需要特定字符串的文件中,我都会包含该文件:
include "Common.h"
然后在我需要字符串的地方使用:
Common::mystring
现在我在 Xcode 中注意到,目标中没有包含任何“.h”文件。但似乎我的程序按预期运行良好。有人可以解释 .h 文件会发生什么吗?这是如何运作的 ?是因为“包含”“Common.h”的文件拥有所有数据的拷贝吗?
最佳答案
header 未编译(预编译 header 除外,这是一种常见的构建优化技术,并且是错误的),而是像 OP 怀疑的那样,被复制到使用它们的文件中。
来自 C++ 标准中的 [cpp.include]
A preprocessing directive of the form
# include
" q-char-sequence" new-linecauses the replacement of that directive by the entire contents of the source file identified by the specified sequence between the " delimiters.
包含的文件被粘贴到#include
指令所在的正在编译的文件中,替换了#include
。
因此,如果一个文件未包含,它永远不会被替换到正在编译的文件中,并且该文件绝对不会发生任何事情。
包含文件不需要在项目、目标 makefile 或您拥有的任何地方列出。文件的包含严格取决于执行包含的 cpp 文件,尽管通常会出现一个查找包含的 header 的位置列表,以从源代码中抽象出工具链和库。
关于c++ - 编译期间未包含在目标中的 .h 文件会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40354900/