Я наткнулся на это странное поведение при компиляции программ на C с использованием gcc.Несколько определений глобальной переменной
Допустим, у нас есть эти два простых исходных файлов:
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] (http://stackoverflow.com/questions/7189982/two-variables-with-same-name-and -type-in-two-different-c-files-compile-with-g) – LPs
http://stackoverflow.com/q/21275992/3049655, http://stackoverflow.com/questions/1490693/tentative-definitions- in-c99-and-linking –
[Эта статья SO] (http://stackoverflow.com/questions/3095861/about-tentative-definition) может быть полезна. –