Относительно использования ключевого слова extern
extern int var;
Я понимаю, что когда мы используем 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;
как показано выше) является определение, почему ниже код не дает множественное определение ОШИБКА?
#include <stdio.h>
int i;
int i;
int i;
int main()
{
printf("%d ", i);
return 0;
}
1 ответ
Без явной инициализации все int i
S в глобальном пространстве называют предварительным определением. Однако это не разрешено в локальной области.
Процитировать C11
стандарт, глава §6.9.2, определения внешних объектов
Объявление идентификатора для объекта, имеющего область файла без инициализатора и без спецификатора класса хранения или со статическим спецификатором класса хранения, составляет предварительное определение. Если модуль перевода содержит одно или несколько предварительных определений для идентификатора, а модуль перевода не содержит внешнего определения для этого идентификатора, то поведение точно такое, как если бы модуль перевода содержал объявление области файла для этого идентификатора с составным типом как конца блока перевода, с инициализатором, равным 0.