Давайте немного забудем о заголовочных файлах (после того, как все их содержимое вставлено в исходные файлы во время компиляции, и они существуют только во время предварительной обработки).Это простой способ использовать один и тот же код в нескольких исходных файлах (подумайте, скопируйте / вставьте).Таким образом, в интересах эффективности этот дублированный код не должен ничего не делать ;или мы рискуем сделать что-то более одного раза.
int x; /* puts aside a memory area with space for an int and call it x */
extern int x; /* tell the compiler that x exists and it is an int */
Что из перечисленного делает меньше?Это тот, который нужно поместить в заголовочный файл.Но, как мы уже говорили, компилятор x
существует, нам нужно где-то его определить.Лучшее место для его определения - исходный файл.
Поскольку заголовочные файлы ничего не делают, их довольно безопасно вставлять в большое количество исходных файлов .
Теперь вернемся к заголовочным файлам.Они обычно связаны с определенным исходным файлом (через их имена: foobar.h связан с foobar.c).Это хороший способ определить, где декларации в заголовочном файле определены .
/* foobar.h */
extern int x;
void myfoo(int);
После просмотра этого заголовочного файла я ожидаю foobar.c
содержать определение x
и myfoo
.
/* foobar.c */
int x; /* global x. BAD BAD BAD */
void myfoo(int alpha) { x = !x; return x ? alpha : 0; }
Почему глобалы плохие?
цитата из http://c2.com/cgi/wiki?GlobalVariablesAreBad
Действительно плохие причины для использования глобальных переменных
- "Я медленный машинистка. Глобальные слова спасают меня от нажатия клавиш."
- "Я не хочу передаватьэто все время. "