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