Проблема в том, что в C static может иметь разные значения.Я попытаюсь дать обзор различных ситуаций в следующих параграфах.
Если переменная определена вне функции, она может использоваться всеми функциями в файле.Иногда также называется «глобальной переменной».Это означает, что существует только один экземпляр этой переменной для всего файла.Также имя переменной сохраняется в результирующем файле .OBJ.Последнее важно, так как, если другой файл также определяет переменную с тем же именем вне функции, компоновщик предполагает, что в обоих случаях это одна и та же переменная, и объединяет их.Чтобы сделать это более понятным, лучше всего добавить ключевое слово "extern" к одной из переменных.В этом случае мы говорим, что объявляем переменную, а не определяем ее.Это дополнительный сигнал для компилятора / компоновщика, указывающий, что мы действительно хотим сослаться на глобальную переменную, определенную где-то еще.
Если вы хотите определить глобальную переменную, но не хотите сделать ее доступнойв другие файлы добавьте ключевое слово static перед.Ключевое слово static сообщает компилятору, что имя переменной не должно храниться в файле .OBJ.Это означает, что два файла .C со следующей строкой:
static long MyGlobalVariable;
каждый будет иметь свою собственную переменную.Обе переменные будут называться MyGlobalVariable.
Если вы определите переменную внутри функции, она станет локальной переменной.Он возникает, если функция вызывается, и снова исчезает после завершения функции.В некоторых ситуациях вы хотите сохранить значение переменной между вызовами функций.Вы можете сделать это, используя глобальную переменную (вместо локальной переменной), но тогда эта переменная станет доступной для всех функций в файле, что вам необязательно.В этом случае вы можете поместить ключевое слово static перед переменной, например так:
void MyFunction()
{
static long MyLocalVariable = 0;
++MyLocalVariable;
}
При первом вызове функции MyLocalVariable будет «создан» и инициализирован значением 0. В концефункция, переменная не уничтожается, но сохраняется.Поэтому в следующий раз, когда вы вызовете эту функцию, значение переменной будет равно 1, а не нулю.
В C действительно не имеет значения, помещаете ли вы переменную вне функции (как глобальную переменную) или определяетеэто как статический внутри функции.Единственная разница в том, где к переменной можно получить доступ.
В C ++ все совсем по-другому.Если вы напишите это (вне функции):
MyClass MyGlobalVariable;
MyGlobalVariable будет создан (это: конструктор будет выполнен) в начале приложения, до того, как будет вызван даже main.Однако вы не можете реально контролировать порядок, в котором создаются все глобальные переменные.Так что, если другой файл содержит это:
MyOtherClass MySecondGlobalVariable;
Вы не можете точно знать, был ли сначала создан MyGlobalVariable или MySecondGlobalVariable.Это может создать проблемы, если конструктор одного из них зависит от наличия (конструкции) другого.
С другой стороны, если вы определяете переменную как статическую внутри функции:
void MyFunction()
{
static MyClass MyStaticVariable;
}
Тогда MyStaticVariable будет создан при первом вызове функции.С помощью этой конструкции вы можете написать что-то вроде этого:
MyClass &getMyClass()
{
static MyClass MySelf;
return MySelf;
}
И мы реализовали синглтон, в котором мы можем контролировать его построение.Первый раз, когда нам это нужно, он создается.
Если честно, этот подход является довольно упрощенным, поскольку он может привести к проблемам в многопоточных приложениях.В этом случае есть и другие хитрости.