全局变量的多重定义问题

3
我发现在使用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这种形式编译时,不会产生多重定义链接错误

无论全局变量是否初始化,人们都会期望多重定义链接错误会发生。那么这是否意味着编译器默认将未初始化的全局变量设置为外部变量?


请返回翻译后的文本:https://dev59.com/AWEi5IYBdhLWcg3wb7-Ohttps://dev59.com/enI_5IYBdhLWcg3wMf5_ - Spikatrix
这篇关于“试定义”的SO文章或许能帮到您。 - Jabberwocky
相关说明,当在共享库中访问时,可以使用dlsym()找到两者。这就是RTLD_NEXT参数的作用。我不知道顺序是如何确定的,但最好避免使用它,或通过在其他文件中定义一次并使用extern关键字来共享它。 - adam
1个回答

1
全局变量可以有任意数量的声明,但只能有一个定义。初始化程序使其成为定义,因此即使它们相同,它也会抱怨有两个这样的定义。

我不认为你是正确的,因为int var;是一个变量声明和定义。你可以立即使用它这一事实证明它也是一个定义,不是吗? - Marin Veršić
1
C99标准称之为“试探性定义”;“多重定义”错误信息(以及我)仍在使用旧的K&R术语。 - Lee Daniel Crocker
是的,就像我从@酷哥的评论中发现的那样。 - Marin Veršić

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接