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

bejyjqdl  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(141)

我在使用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时,这不会产生多定义链接器错误
不管全局变量的初始化如何,我们都希望多定义链接器错误同样会发生。这是否意味着编译器默认将未初始化的全局变量设置为外部变量?

3z6pesqy

3z6pesqy1#

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

相关问题