Использование статических переменных и функций в глобальной области видимости

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

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


person org 100h    schedule 18.01.2011    source источник
comment
Звучит так, как будто кто-то называет что-то домашним заданием   -  person org 100h    schedule 18.01.2011


Ответы (3)


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

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

person Benoit Thiery    schedule 18.01.2011
comment
В C++ следует использовать безымянные пространства имен. - person Matthieu M.; 18.01.2011

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


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

Раздел $7.3.1.1/2 стандарта C++ (2003 г.) гласит:

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

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

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

person Nawaz    schedule 18.01.2011
comment
И последний черновик C++0x не поддерживает его. - person Fred Nurk; 18.01.2011
comment
@Fred: забавно, между n3092 и n3225 это изменилось, знаете ли вы, что послужило причиной этого изменения? - person Matthieu M.; 18.01.2011
comment
@Matthieu: это еще интереснее. Не могли бы вы рассказать нам, что мотивировало это изменение? или хотя бы отсылать нас к ссылке? - person Nawaz; 18.01.2011
comment
Я не смог найти ничего действительно важного, я задал вопрос ( stackoverflow.com/questions/4726570/ ), будем надеяться, что кто-то на SO знает что-то об этом. - person Matthieu M.; 18.01.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();                   
}

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

person Mahesh    schedule 18.01.2011
comment
Но инициализируется ли статическая переменная области действия функции во время выполнения или только тогда, когда запускается ее функция области видимости, в данном случае foo()? - person James Kuang; 08.05.2014
comment
@Mahesh Разве globalVar не является нестатическим, если вы не укажете static по умолчанию? Я думаю, что можно легко расширить нестатические глобальные переменные. - person starkk92; 15.10.2014