【发布时间】:2012-09-01 20:29:32
【问题描述】:
我知道人们建议在头文件中包含头保护,以防止头文件内容被预处理器多次插入到源代码文件中。
但请考虑以下情况:
假设我有文件main.cpp、stuff.cpp 和commonheader.h,其中.h 文件有其标头保护。
如果任一.cpp 文件尝试多次包含commonheader.h,则预处理器
将阻止这种情况发生,并且在编译为我们得到的目标代码后,
main.o 包含 commonheader.h 的内容恰好一次。
stuff.o 包含 commonheader.h 的内容恰好一次。
请注意,commonheader 的内容已在文件中重复,但不在同一个 .o 文件中。
那么在链接步骤中会发生什么?由于 .o 文件被融合到一个可执行文件中 我们将不得不第二次确保 commonheader 的内容不被重复。编译器会处理这个吗?如果不是,那么当我们处理巨大的头文件时,这不是一个问题,会导致文件之间的代码重复并导致较大的可执行文件大小。
如果我在问题的任何地方都犯了一些概念上的错误,请纠正我。
【问题讨论】:
-
你的意思是每个对象文件都得到了
commonheader.h的副本? -
为什么?我认为,预处理阶段涉及将头文件的内容直接粘贴到源文件中。
-
是的,#include 宏复制该文件的内容,可能是在通过预处理器运行它之后。
-
#include 会将文件内容准确地复制到该单词所在的位置! +1 @dutt