Есть ли смысл помечать переменную как static
, когда она находится в глобальной области действия файла .cpp, а не в функции?
Можно ли использовать статическое ключевое слово и для функций? Если да, то в чем их польза?
Есть ли смысл помечать переменную как static
, когда она находится в глобальной области действия файла .cpp, а не в функции?
Можно ли использовать статическое ключевое слово и для функций? Если да, то в чем их польза?
В этом случае ключевое слово static означает, что функция или переменная могут использоваться только кодом в том же файле cpp. Связанный символ не будет экспортирован и не будет использоваться другими модулями.
Это хорошая практика, чтобы избежать конфликта имен в больших программах, когда вы знаете, что ваши глобальные функции или переменные не нужны в других модулях.
Да, если вы хотите объявить переменную области файла, необходимо ключевое слово static
. static
переменные, объявленные в одной единице перевода, не могут ссылаться на другую единицу перевода.
Кстати, использование ключевого слова static
устарело в C++03.
Раздел $7.3.1.1/2 стандарта C++ (2003 г.) гласит:
Использование статического ключевого слова устарело при объявлении объектов в области пространства имен; unnamed-namespace обеспечивает превосходную альтернативу.
C++ предпочитает пространство имен unnamed ключевому слову static
. Смотрите эту тему:
Преимущество безымянного пространства имен над статическим?
Возьмем за пример -
// At global scope
int globalVar; // Equivalent to static int globalVar;
// They share the same scope
// Static variables are guaranteed to be initialized to zero even though
// you don't explicitly initialize them.
// At function/local scope
void foo()
{
static int staticVar ; // staticVar retains it's value during various function
// function calls to foo();
}
Оба они перестают существовать только тогда, когда программа завершается/выходит.