Относительно использования ключевого слова 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 iS в глобальном пространстве называют предварительным определением. Однако это не разрешено в локальной области.

Процитировать C11 стандарт, глава §6.9.2, определения внешних объектов

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

Другие вопросы по тегам