没有。相反:
#include 执行文本替换:它打开文件并将其所有1 内容复制到您的主 C 文件中。在此过程中,它执行包含文件中的所有预处理器指令。除其他外,这意味着它将递归地在标头中包含所有#included 的文件。
#include 不知道也不关心您最终使用了包含文件的哪一部分。
1 如前所述,预处理器指令在包含的文件中执行。这可以修改包含的内容。例如,假设以下头文件header.h:
#ifndef HEADER_H
#define HEADER_H
#ifdef NDEBUG
# define LOG(...) ((void) 0)
#else
# define LOG(...) log_message(__FILE__, __LINE__, __VA_ARGS__)
inline void log_message(const char* filename, int line, ...) {
// Logging code omitted for brevity.
}
#endif
// other stuff
#endif
现在,如果您的 main.c 文件如下所示:
#define NDEBUG
#include "header.h"
int main(void) {
// …
LOG("hello");
}
...那么,经过预处理后,您的 main.c 文件将如下所示(我省略了一些不相关的内容):
# 1 "main.c"
# 1 "./header.h" 1
# 13 "./header.h"
// other stuff
# 3 "main.c" 2
int main(void) {
// …
((void) 0);
}
... 换句话说,只有header.h 中对应于#ifdef NDEBUG 的部分被包括在内,而不是#else 子句中的部分。如果我们包含header.h 而不定义NDEBUG,那么包含的标头代码将包含log_message 的定义。