【发布时间】:2011-01-14 01:51:49
【问题描述】:
我对 C 和编译过程的基本知识最近已经生疏了。我试图找出以下问题的答案,但我无法连接编译、链接和预处理阶段的基础知识。在谷歌上快速搜索也没有多大帮助。所以,我决定来到知识的终极来源:)
我知道:不应在 .h 文件中定义变量。可以在那里声明它们。
原因:因为一个头文件可能会从多个位置包含进来,因此多次重新定义变量(链接器给出错误)。
可能的解决方法:在头文件中使用 header-guards 并在其中定义变量。
这真的是一个解决方案吗: 不。因为标头守卫用于预处理阶段。就是告诉编译器这部分已经包含了,不要再包含了。但是我们的多重定义错误出现在链接器部分——在编译之后。
这整件事让我对预处理和链接的工作方式感到困惑。我认为如果已定义标头保护符号,预处理将不包含代码。那样的话,变量问题的多重定义不也应该得到解决吗?
如果这些预处理指令使编译过程免于在标头保护下重新定义符号,但链接器仍然获得符号的多个定义,会发生什么情况?
【问题讨论】:
标签: c linker c-preprocessor header-files include-guards