Действительно, «нет связи» в области действия функции.
Цель - управление продолжительностью жизни : статика имеет время жизни глобальной статики, тогда как она имеет видимость (область действия) локального. 1009 *
Примечание
В C ++ вы также можете объявлять статические объекты («глобальные переменные») без привязки, заключая их в анонимное пространство имен. Этот прием обычно используется в библиотеках только для заголовков:
namespace /*anon*/
{
void foo() {} // only in this translation unit
int answer = 42; // this too
}
Что произойдет, если я использую extern
?
Если вы используете extern, объявление является только объявлением extern
(ничего не определено ). Таким образом, обычно ожидается, что внешняя связь по определению будет определена в другой единице перевода. (Таким образом, он действует так же, как если бы он был объявлен в глобальной области видимости). Это похоже на объявления локальных функций:
int main()
{
void exit(int); // equivalent to non-local declaration
}
Обратите внимание, что в вашем примере 2.
переменная i
уже объявлена static
, и поэтому она не получит внешнюю связь. Однако я могу быть объявлен в другом модуле перевода без конфликтов компоновщика.