Что значит static в функциях и глобальных переменных?

Что значит static в функциях и глобальных переменных? Я не говорю про статические методы, поля или что-то ещё связанное с ооп или статические локальные переменные в функциях. Вот это штука появилась уже с cи. Информацию про это я не нашел или непонятно рассказывали.


Ответы (1 шт):

Автор решения: HolyBlackCat

Так нужно помечать переменные и функции внутри .cpp-файлов, которые используются только внутри этого файла, т.е. не объявлены в хедере. В C++ тот же эффект1 имеет анонимный namespace {...}, но последний также действует на классы (что становится важно, если в них есть функции, статические переменные, и т.п.).

Это избавляет от ошибок линковки2, если имена переменных/функций совпадают в разных .cpp-файлах.

И, соответственно, к такой переменной/функции нельзя обратиться из другого файла, объявив ее там.


В комментариях мелькает "область видимости" и "storage duration", но на глобальных переменных/функциях static на них не влияет. Он влияет только на "linkage" (ставит "internal linkage" вместо "external linkage").


1 Стандарт говорит, что эффект одинаковый, но на деле оказывается, что статические переменные/функции правда не видны линковщику, а содержимое анонимного неймспейса вроде как видно, хотя и помечено особым образом, чтобы эффект был тот же. Но это надо проверять.

2 Ошибки не всегда явные. Если это два класса с одинаковым именем, и в них методы с одинаковым именем, и они inline (возможно неявно - потому что определены внутри тела класса), то линковщик может один из них выкинуть, и вместо него вызывать второй.

→ Ссылка