Использование статических переменных и функций в глобальной области видимости - PullRequest
21 голосов
/ 18 января 2011

Можно ли пометить переменную как static, когда она находится в глобальной области видимости файла .cpp, а не в функции?

Можете ли вы использовать ключевое слово static для функций? Если да, то для чего они нужны?

Ответы [ 3 ]

19 голосов
/ 18 января 2011

Да, если вы хотите объявить переменную области файла, тогда необходимо ключевое слово static. static переменные, объявленные в одной единице перевода, нельзя ссылать из другой единицы перевода.


Кстати, использование ключевого слова static устарело в C ++ 03.

В разделе $ 7.3.1.1 / 2 стандарта C ++ (2003) указано,

Использование статического ключевого слова не рекомендуется при объявлении объектов в область пространства имен; безымянное пространство имен обеспечивает превосходное Альтернатива.

C ++ предпочитает безымянное пространство имен над ключевым словом static. Смотрите эту тему:

Превосходство безымянного пространства имен над статическим?

15 голосов
/ 18 января 2011

В этом случае ключевое слово static означает, что функция или переменная может использоваться только кодом в том же файле cpp.Связанный символ не будет экспортирован и не будет использоваться другими модулями.

Это хорошая практика, чтобы избежать столкновения имен в большом программном обеспечении, когда вы знаете, что ваши глобальные функции или переменные не нужны в других модулях.

1 голос
/ 18 января 2011

В качестве примера -

// 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();                   
}

Они оба перестают существовать, только когда программа завершает работу / завершает работу.

...