Почему нестатическая переменная не может находиться в заголовочном файле?
Поскольку оно нарушает Одно правило определения (ODR) .
Когда вы включаете заголовочный файл, содержащий нестатическую переменную, объявлениепеременной вставляется в каждый исходный файл, где он включен.Таким образом, в итоге у вас будет более одного определения переменной в одном Единице перевода , это нарушит ODR и, следовательно, компоновщик выдаст вам ошибки при связывании.
Как объяснить статические переменные, объявленные в заголовочных файлах?
Когда вы объявляете статическую переменную в заголовочном файле, копия переменной создается в каждой Единица перевода , где включен заголовочный файл.
Объявление статической переменной в заголовочном файле не даст вам многократных ошибок определения, но это не приведет к вашей цели иметь глобальную переменную, значение которой является общим для всех файлов, которые к ней обращаются.
ВыМожет показаться, что, поскольку вы используете глобальную статическую переменную, ее значение будет сохраняться в разных файлах, но, как упоминалось выше, у каждого модуля перевода есть своя копия переменной, и она не достигает того, что, по вашему мнению, вы получаете.
Предполагается ли наличие в заголовочном файле статических переменных (не говоря уже о членах)?
Нет, никогда!
Как объявлять и определять глобальные переменные?
Вам необходимо использовать ключевое слово extern
.
Добавить объявление extern переменной в заголовочный файл.Заголовок должен быть включен в один исходный файл, который определяет переменную, и во все исходные файлы, которые ссылаются на переменную. Только один исходный файл должен определить переменную.Также только один заголовочный файл должен объявлять переменную.
filename.h
extern int gVariable; /* Declaration */
file1.cpp
#include "filename.h"
/* Definition */
int gVariable = 37;
void doSomething(void)
{
return gVariable++;
}
file2.cpp
#include "filename.h"
#include <stdio.h>
void doSomethingWithGlobal(void)
{
printf("Global variable: %d\n", gVariable++);
}