Почему требуется инициализация переменных, объявленных глобально с помощью extern
?
// declarations
extern int foo1;
extern int foo2;
Инициализация не требуется. Глобальные переменные, не имеющие явной инициализации, инициализируются, как показано ниже.
Объявление переменная не определение it. В некоторых единицах переменная, если она используется, должна быть определена.
Почему инициализация не требуется для переменных, объявленных глобально без extern
?
// declaration and definition - no initialization
int foo3; // Same functional effect as int foo3 = 0;
// declaration and definition - with initialization
int foo4 = 5;
Глобальные переменные, не имеющие явной инициализации инициализируется, как показано ниже.
C11dr 6.7.9 Initialization
... Если объект, который имеет длительность статического или потока хранения не инициализируется явно, то:
- если он имеет тип указателя, он инициализируется к нулевому указателю;
- если он имеет арифметический тип, он инициализируется (положительным или без знака) нулем;
- если он является агрегатом, каждый элемент инициализируется (рекурсивно) в соответствии с этими правилами, и любое заполнение инициализируется нулевыми битами;
- если это объединение, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правилами, и любое заполнение инициализируется нулевыми битами;
Вы уверены, что вы были в понятиях? Чаще всего 'extern SomeType some_variable;' используется без инициализации в файле заголовка для объявления переменной, а 'SomeType some_variable = {...};' используется для определения и инициализации переменной в одном исходном файле. Это похоже на то, что вы утверждаете. См. [Как использовать 'extern' для обмена переменными между исходными файлами в C] (http://stackoverflow.com/questions/1433204/how-do-i-ex-extern-to-share-variables-between-source -files-in-c /) для подробных подробностей. Прекратите чтение в одной из двух ранее остановленных точек (вы увидите). –
Инициализация * не * требуется для переменной 'extern'. переменная 'extern' явно * не * определена в этом файле, а является ссылкой на переменную, определенную в каком-либо другом объектном файле, который будет связан с этим. –