Во-первых, слово «статический» имеет два значения в C ++: оно может относиться к ключевому слову static
(которое, в свою очередь, имеет разные эффекты в зависимости от того, где оно используется), или оно может относиться к времени жизни переменной: все переменные, определенные в пространстве имен, имеют статическое время жизни.
Из того, что вы говорите, я думаю, что вы ищете переменную со статическим временем жизни, которая не была бы видна за пределами единой единицы перевода, гдекажется.Предпочтительный способ сделать это - определить переменную в безымянном пространстве имен:
namespace {
int myWhatever; // No keyword static...
}
Переменные-члены класса, которые объявлены static
, также имеют статическое время жизни, как и локальные переменные (внутри функции), которыеобъявляется static
.
Такая переменная доступна везде после определения в единице перевода, но не где-либо еще.У него есть один экземпляр, который возникает в начале программы и длится до тех пор, пока программа работает.Если он имеет конструктор, конструктор будет вызываться до main
(или при загрузке динамического объекта, если используется динамическое связывание), а его деструктор будет вызываться после вызова exit
(или когда динамический объектвыгружается, если используется динамическое связывание).
Что касается потоков, C ++ 11 имеет спецификатор класса хранения thread_local
: переменные, объявленные с этим спецификатором, имеют по одному экземпляру на поток с временем жизни, равнымэквивалент этого потока.Он будет инициализирован (создан) перед первым использованием и уничтожен при выходе из потока.Это что-то отличное от статического.