gpt4 book ai didi

c - 头文件中的全局变量

转载 作者:太空狗 更新时间:2023-10-29 16:19:13 24 4
gpt4 key购买 nike

我有 2 个模块(.c 文件)和一个 .h 头文件:

文件1.c:

#include <stdio.h>
#include "global.h"

int main()
{
i = 100;
printf("%d\n",i);
foo();
return 0;
}

文件2.c

#include <stdio.h>
#include "global.h"

void foo()
{
i = 10;
printf("%d\n",i);
}

全局.h

int i;
extern void foo()

当我执行 gcc file1.c file2.c 时,一切正常,我得到了预期的输出。现在,当我将头文件中的变量“i”初始化为 0 并再次编译时,出现链接器错误:

/tmp/cc0oj7yA.o:(.bss+0x0): multiple definition of `i'
/tmp/cckd7TTI.o:(.bss+0x0): first defined here

如果我只是用头文件中的初始化编译 file1.c(删除对 foo() 的调用),即 gcc file1.c,一切正常。这是怎么回事?

最佳答案

您描述了 3 种情况:

  1. 包含 2 个 .c 文件和 header 中的 int i;
  2. 有 2 个 .c 文件和标题中有 int i=100;(或任何其他值;这无关紧要)。
  3. 包含 1 个 .c 文件, header 中包含 int i=100;

在每个场景中,想象一下将头文件的内容插入到.c文件中,并将这个.c文件编译成一个.o 文件,然后将这些链接在一起。

然后会发生以下情况:

  1. 由于已经提到的“暂定定义”而工作正常:每个 .o 文件都包含其中一个,因此链接器说“ok”。

  2. 不起作用,因为两个 .o 文件都包含一个带有值的定义,该定义发生冲突(即使它们具有相同的值)- 可能只有一个具有任何给定的值在给定时间链接在一起的所有 .o 文件中的名称。

  3. 当然可以,因为您只有一个 .o 文件,所以不可能发生冲突。

恕我直言,干净的东西是

  • extern int i; 或只是 int i; 放入头文件中,
  • 然后将 i 的“真实”定义(即 int i = 100;)放入 file1.c。在这种情况下,此初始化在程序开始时使用,main() 中的相应行可以省略。 (此外,我希望命名只是一个示例;请不要在实际程序中将任何全局变量命名为 i。)

关于c - 头文件中的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8108634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com