static
переменная имеет внутреннюю связь. Это означает, что если у вас есть статическая переменная a
в x.h
и вы включаете x.h
в два файла, скажем m.cpp
и n.pp
, то каждый из этих двух файлов получает свою собственную копию a
, которая означает, что если вы измените его значение в m.cpp
, то n.cpp
не увидит этого изменения, поскольку в каждой единице перевода есть две переменные с одинаковым именем (.cpp). И они независимы друг от друга.
Но если a
не является статичным, то, включив x.h
в более чем один файл, вы получите ошибку множественного определения, потому что каждое включение x.h
будет пытаться определить a
, но с a
не является статичным; теперь он имеет внешнюю связь, что означает, что если она определена в m.cpp
, то вы получите ошибку при включении x.h
в n.cpp
(или наоборот). В этом случае вы должны написать x.h
как:
//x.h
extern int a;
А затем определите a
только в одном файле .cpp
, либо m.cpp
или n.cpp
, но не в обоих. Скажите его m.cpp
.
//m.cpp
#include "x.h"
int a =10;
И все готово. Теперь вы можете включить x.h
в любое количество файлов .cpp
и получить доступ к a
, изменить его значение и делать все, что захотите. Любые изменения в нем будут теперь видны всем .cpp
файлам.