代码之家  ›  专栏  ›  技术社区  ›  Methos

头文件中的变量定义

  •  24
  • Methos  · 技术社区  · 15 年前

    我的基本知识 C 最近,编译过程变得生疏了。我试图找出以下问题的答案,但我无法连接编译、链接和预处理阶段的基础知识。在谷歌上快速搜索也没有多大帮助。所以,我决定找到知识的最终来源:)

    我知道:

    为什么? 因为头文件可能会从多个位置包含,因此会多次重新定义变量(链接器会给出错误)。

    在头文件中使用头保护并在其中定义变量。

    否。因为收割台防护装置用于预处理阶段。也就是说,告诉编译器这个部分已经包含,不再包含它。但是我们的多定义错误出现在链接器部分——在编译之后。

    这整件事让我困惑于如何进行预处理&链接工作。我认为,如果定义了标题保护符号,预处理将不包括代码。在这种情况下,一个变量的多重定义问题不应该也得到解决吗?

    4 回复  |  直到 5 年前
        1
  •  26
  •   Jay    15 年前

    Header guard保护您不受单个源文件中多个包含项的影响,而不受多个源文件的影响。我想你的问题源于不理解这个概念。

        2
  •  28
  •   Richard Pennington    15 年前

    我在过去使用过一件事(当全局变量流行时):

    var.h文件:

    ...
    #ifdef DEFINE_GLOBALS
    #define EXTERN
    #else
    #define EXTERN extern
    #endif
    EXTERN int global1;
    EXTERN int global2;
    ...
    

    .c文件(通常是包含main()的文件):

    #define DEFINE_GLOBALS
    #include "var.h"
    

    请注意,DEFINE_GLOBALS不是头保护,而是允许根据是否定义变量来声明/定义变量。此技术允许声明/定义的一个副本。

        3
  •  10
  •   bmargulies    15 年前

    分别地 . 每一个都包括您的头文件。一旦每个人都有一个定义。它们在连接时发生冲突。

    #ifdef DEFINE_SOMETHING
    int something = 0;
    #endif
    

    然后你就可以在 只有一个 .c文件。

        4
  •  8
  •   anon anon    15 年前

    在同一翻译单位 (即在同一个.c源文件中)。如果将文件包含在两个或多个翻译单元中,则它们无效。