Приведенный пример применения спецификатора класса памяти
extern не является ошибкой.
Дело в том, что в описании языка C, данном его разработчиками, отсутствовала ясная трактовка понятий объявления и определения глобальной переменной. [Керниган Б., Ритчи А., Фьюзер А.: Язык программирования C. Задачи по языку C. Финансы и статистика. 1985]. Поэтому многие компиляторы считают, что глобальная переменная представляет собой единую область памяти, разделяемую несколькими исходными файлами, причем в каждом из них переменная может иметь свой тип. Размер выделяемой памяти будет равен размеру наиболее длинного объявления. Вот почему во многих учебникам по языку C советуют внимательно работать с глобальными переменными.
Для себя давно разработал простой прием. Объявляю все глобальные переменные в одном месте и свожу их в структуру. Типа:
Код
struct GLOBAL {
int v1;
int v2;
char v3;
}VARIABLE;
Начальная инициализация там, где и положено - в функции main().
Тогда объявление глобальных переменных в остальных файлах сводится к одной строчке:
Код
extern struct GLOBAL VARIABLE;
.............
// и работа с переменными.
VARIABLE.v1 = 1;
Программа выглядит более организованно.
Сообщение отредактировал LVII - Nov 5 2009, 23:41