GCC:全局变量的多个定义不会给出链接器错误

问题描述 投票:0回答:1

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

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

有趣.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个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.