Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 头文件中的全局变量_C_Include_Global Variables_Header Files_C89 - Fatal编程技术网

C 头文件中的全局变量

C 头文件中的全局变量,c,include,global-variables,header-files,c89,C,Include,Global Variables,Header Files,C89,有一个头文件foo.h,其中包含一个全局变量声明inti。这个头文件分别包含在one.c和two.c中(我知道这不是一个很好的生活选择,但它不是我的) 这是否意味着在每个*.c文件中存在两个名为i的不同变量 本例中的声明/定义情况如何(根据标准) 是的,具有外部链接的全局变量i将存在于两个编译单元中。这将在链接阶段产生冲突错误 在理想情况下,foo.h头应该只包含声明:extern int i和实际定义int i应仅存在于一个文件中 另一种选择是使用静态int i在foo.h中。这将创建带有内部

有一个头文件
foo.h
,其中包含一个全局变量声明
inti。这个头文件分别包含在
one.c
two.c
中(我知道这不是一个很好的生活选择,但它不是我的)

  • 这是否意味着在每个*.c文件中存在两个名为
    i
    的不同变量

  • 本例中的声明/定义情况如何(根据标准)


  • 是的,具有外部链接的全局变量
    i
    将存在于两个编译单元中。这将在链接阶段产生冲突错误

    在理想情况下,
    foo.h
    头应该只包含声明:
    extern int i和实际定义
    int i应仅存在于一个文件中


    另一种选择是使用
    静态int i
    foo.h
    中。这将创建带有内部链接的
    i
    ,这意味着变量在包含头的每个编译单元上都是本地的。但是,在标题中声明
    静态
    变量通常被认为是一种不好的做法。

    是的,两个编译单元中都会存在带有外部链接的全局变量
    i
    。这将在链接阶段产生冲突错误

    在理想情况下,
    foo.h
    头应该只包含声明:
    extern int i和实际定义
    int i应仅存在于一个文件中


    另一种选择是使用
    静态int i
    foo.h
    中。这将创建带有内部链接的
    i
    ,这意味着变量在包含头的每个编译单元上都是本地的。但是,在标题中声明
    静态
    变量通常被认为是一种不好的做法。

    多个变量定义将导致链接器错误。

    多个变量定义将导致链接器错误。

    您将导致链接器错误


    请搜索“
    extern
    ”关键字。

    您将遇到链接器错误


    请搜索“
    extern
    ”关键字。

    当您将头文件包含在另一个文件中时,直到它们在某个时间被编译,即它们位于单个翻译单元中,您不会得到错误。但是如果你必须编译两个文件,即

    gcc-C1.C2.c

    那么是的,你遇到麻烦了


    它与声明/定义无关。使用static为相关变量设置文件范围或更改设计。

    当您将头文件包含在另一个文件中时,直到它们在某个时间被编译(即它们位于单个翻译单元中),您不会得到错误。但是如果你必须编译两个文件,即

    gcc-C1.C2.c

    那么是的,你遇到麻烦了


    它与声明/定义无关。使用static为相关变量设置文件范围或更改设计。

    我看到了这个问题。这就是问题2的原因。我见过这个问题。这就是问题2的原因。好的,从技术上讲,我们有2
    inti-s,对吗?关于暂定定义方面呢?据我所知,
    inti只有在没有其他定义时才会被视为定义。这就是会发生错误的原因,还是其他原因?是的,每个文件上有一个
    i
    ,总共2个。您正在描述在同一编译单元中定义两次
    inti
    的情况。你可以写
    inti;int i
    ,它将只生成1个
    i
    。这里的情况并非如此。这种冲突发生在链接阶段的后面,当有2个
    i
    s来自不同的编译单元时。谢谢。现在我明白了。不完全确定,因为正在执行链接的程序(不是普通链接器)没有抛出错误。头文件中放置的任何类型的非常量变量都被认为是非常糟糕的做法。好的,从技术上讲,我们有2
    int i-s,对吗?关于暂定定义方面呢?据我所知,
    inti只有在没有其他定义时才会被视为定义。这就是会发生错误的原因,还是其他原因?是的,每个文件上有一个
    i
    ,总共2个。您正在描述在同一编译单元中定义两次
    inti
    的情况。你可以写
    inti;int i
    ,它将只生成1个
    i
    。这里的情况并非如此。这种冲突发生在链接阶段的后面,当有2个
    i
    s来自不同的编译单元时。谢谢。现在我明白了。不完全确定,因为正在执行链接的程序(不是普通链接器)没有抛出错误。任何类型的非常量变量放在头文件中都被认为是非常糟糕的做法。