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