2016-03-16 2 views
3

Я наткнулся на это странное поведение при компиляции программ на 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?

+2

Возможный дубликат [Две переменные с одинаковым именем и типом в двух разных файлах .c, скомпилированные с помощью gcc] (http://stackoverflow.com/questions/7189982/two-variables-with-same-name-and -type-in-two-different-c-files-compile-with-g) – LPs

+0

http://stackoverflow.com/q/21275992/3049655, http://stackoverflow.com/questions/1490693/tentative-definitions- in-c99-and-linking –

+0

[Эта статья SO] (http://stackoverflow.com/questions/3095861/about-tentative-definition) может быть полезна. –

ответ

1

Глобальная переменная может иметь любое количество объявлений , но только одно определение. Инициализатор делает это определение, поэтому он будет жаловаться на наличие двух из них (даже если они согласятся).

+0

Я не верю, что вы правы, потому что int var; это объявление и определение переменной. Тот факт, что вы можете использовать его сразу, доказывает, что это также определение, не так ли? –

+0

Стандарт C99 называет это «предварительным определением»; Сообщение об ошибке «множественное определение» (и I) все еще использует старую терминологию K & R. –

+0

Да, это он, как я только что узнал из комментария @Cool Guy –

Смежные вопросы