static
, как я думаю, вы используете его, это средство скрытия символов.Объявленные static
функции не имеют глобальной видимости (Unix-подобные nm
покажут их как «t», а не «T»).Эти функции нельзя вызывать из других единиц перевода.
Для C ++ static
в этом смысле более или менее заменено анонимным пространством имен, например,
static int x = 0;
довольно эквивалентно
namespace {
int x = 0;
}
Обратите внимание, что анонимное пространство имен уникально для каждой единицы компиляции.
В отличие от static
, анонимное пространство имен также работает для классов.Вы можете сказать что-то вроде
namespace {
class Foo{};
}
и повторно использовать это имя класса для не связанных классов в других единицах перевода.Я думаю, что это относится к вашей точке 3.
Компилятор фактически дает каждому символу, который вы определяете таким образом, уникальное имя (я думаю, что оно включает время компиляции).Эти символы никогда не будут доступны для другого модуля перевода и никогда не будут сталкиваться с символом из другого модуля перевода.
Обратите внимание, что все функции, не являющиеся членами, объявленные как inline
, также по умолчанию static
.Это наиболее распространенное (и неявное) использование static
.Что касается пункта 2, определение функции static
, но не inline
в заголовке является довольно сложным случаем: это не опасно само по себе, но настолько редко полезно, что может привести к путанице.Такая функция может или не может быть запущена в каждой единице перевода.Компилятор может генерировать предупреждения, если вы никогда не вызываете функцию в некоторых TU.И если у этой статической функции есть статическая переменная, вы получите отдельную переменную на единицу перевода даже с одним определением в одном .h
, что может привести к путанице.Просто не так много (не встроенных) вариантов использования.
Что касается пункта 4, я подозреваю, что эти люди связывают статическую функцию-член, означающую static
, со значением связи static
.,Как и любая другая причина для использования анонимного пространства имен для последнего.