c++ - 编译期间未包含在目标中的 .h 文件会发生什么情况?

标签 c++ xcode

我有一个“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-line

causes 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/

相关文章:

c++ - 制作并重新编译带有子目录的 header

xcode - Xcode 4 中的 "Run > Stop on Objective-C exception"?

ios - 我应该用自动约束来布置每个元素吗?

ios - 从尝试填充 TableView 中获取 SIGABRT

ios - 使用xcrun创建带有符号的IPA

iphone - 如何从 iPhone 中的某一天获取日期?

C++逐行读取并输出每一行

c++ - "Function template has already been defined"与互斥的 `enable_if` s

c++ - 远程主机不编译,但它应该

c++ - Windows 上的 OpenCL 库位置