【问题标题】:Multiple definitions of a global variable全局变量的多个定义
【发布时间】:2016-03-16 15:59:59
【问题描述】:

我在使用 gcc 编译 C 程序时偶然发现了这种奇怪的行为。

假设我们有这两个简单的源文件:

fun.c

#include <stdio.h>

// int var = 10;   Results in Gcc compiler error if global variable is initialized
int var;

void fun(void) {
    printf("Fun: %d\n", var);
}

main.c

#include <stdio.h>
int var = 10;
int main(void) {
    fun();
    printf("Main: %d\n", var);
}

令人惊讶的是,当编译为 gcc main.c fun.c -o main.out 时,它不会产生多定义链接器错误

人们会期望多定义链接器错误同样发生,而不管全局变量初始化如何。 是否意味着编译器默认将未初始化的全局变量设为extern?

【问题讨论】:

标签: c gcc global-variables


【解决方案1】:

一个全局变量可以有任意数量的声明,但只能有一个定义。一个初始化器使它成为一个定义,所以它会抱怨有两个(即使他们同意)。

【讨论】:

  • 我不相信你是正确的,因为 int var;是一个变量声明和定义。你可以立即使用它的事实证明它也是一个定义,不是吗?
  • C99 标准将其称为“暂定定义”; “多重定义”错误信息(和我)仍在使用旧的 K&R 术语。
  • 是的,就是这样,正如我刚刚从@Cool Guy 的评论中发现的那样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
相关资源
最近更新 更多