【发布时间】: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?
【问题讨论】:
-
This SO article 可能会有所帮助。
-
相关说明,在共享库中访问时,可以通过 dlsym() 找到两者。这就是 RTLD_NEXT 参数的用途。但是,我不知道顺序是如何确定的。可能是避免它的好习惯,或者通过定义一次并在其他文件中使用 extern 关键字来共享它。
标签: c gcc global-variables