2015-07-27 6 views
3
extern int var; 

Я понимаю, что когда мы используем ключевое слово extern с переменной, как показано ниже, память для этой переменной не выделяется. (Это просто декларация)относительно использования слова extern

extern int i = 0; 

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

Также ниже программа печати 0

#include <stdio.h> 
int i; // Can I treat this as declaration/definition? 
int main() 
{ 
    printf("%d ", i); 
    return 0; 
} 

Я чувствую, здесь переменная i в настоящее время присваивается значение 0.

Если (int i;, как показано выше) является определением, почему ниже код не дает множественного определения ERROR?

#include <stdio.h> 
int i; 
int i; 
int i; 
int main() 
{ 
    printf("%d ", i); 
    return 0; 
} 

ответ

4

Без явной инициализации, все int i s в глобальном пространстве называются предварительное определение. Однако это не разрешено в локальной области.

Цитирую C11 стандарт, глава §6.9.2, Внешние определения объектов

Декларация о качестве идентификатора объекта, который имеет файл сферу без инициализатора, и без хранения класса спецификатора или со спецификатором класса хранения static, представляет собой предварительное определение. Если единица перевода содержит одно или несколько предварительных определений для идентификатора, а единица перевода не содержит внешнего определения для этого идентификатора, то поведение точно такое же, как если бы единица перевода содержала объявление области видимости этого идентификатора с составным типом на конце блока перевода, с инициализатором, равным 0.