Точная формулировка стандарта:
Использование ключевого слова static
не рекомендуется при объявлении объектов в области имен.
Функции в заголовкефайл должен быть inline
, а не static
или в безымянном пространстве имен.inline
означает, что вы получите не более одной копии функции в вашей программе, в то время как другие методы предоставят вам отдельную копию из каждого файла, содержащего заголовок.Помимо раздувания, это может привести к некорректному поведению, если функция содержит статические данные функции.( EDIT: , за исключением случаев, когда предполагается, что функция имеет разные определения в разных блоках компиляции, возможно, из-за разных макросов препроцессора, которые были определены до включения файла заголовка. В этом случае лучший подход не включать еговсе, но вместо этого похоронить его в безымянной могиле с колом в его нечестивом сердце.)
Объекты данных, кроме констант, обычно вообще не должны определяться в заголовочных файлах, только объявлены extern
.
Статические функции-члены - это другой источник рыбы, и вы должны использовать static
, поскольку другого способа объявить их нет.Это использование не считается устаревшим, поскольку оно не входит в область имен.
ОБНОВЛЕНИЕ: C ++ 11 удалило устаревание, поэтому больше нет особой причины предпочитать безымянные пространства именсвыше static
Но вам все равно не следует использовать ни один из заголовочных файлов, если вы не делаете что-то странное.