Из следующего ответ на стек, пользователь говорит:
Это означает, что переменная является локальной для единицы перевода (проще говоря,
к одному исходному файлу), и не могут быть доступны извне. это
использование статики фактически не рекомендуется в текущем стандарте C ++ —
вместо этого вы должны использовать анонимные пространства имен:static int x = 0;
должно быть:
namespace { int x = 0; }
Я не согласен, что анонимные пространства имен являются предпочтительным методом,
но действительно ли использование статики сейчас устарело?
Где стандарт говорит это?
Нет, в настоящее время это не рекомендуется. Это было когда-то, но это было полностью изменено из-за проблем сравнимости C. В некоторый момент до 1999 года это устарело, и это привело к отчет о дефекте 174 который говорит:
Решение об отказе от глобальной статики должно быть отменено.
- Мы не можем отказываться от static, потому что это важная часть C, и отказ от нее сделает C ++ излишне несовместимым с C.
- Поскольку шаблоны могут быть созданы на членах безымянных пространств имен, некоторые системы компиляции могут помещать такие символы в
глобальное пространство линкера, которое может наложить значительное бремя на
линкер. Без статики программисты не имеют механизма, чтобы избежать
бремя.
Это приводит к отчет о дефектах 223 в котором смысл неодобрение был пересмотрен с:
устарела определяется как: Норматив для текущей редакции Стандарта, но не гарантируется, что он станет частью Стандарта в будущих редакциях
было отмечено, что это подразумевает, что только будущие функции будут поддерживаться в будущих стандартах:
Тем не менее, это определение, по-видимому, говорит о том, что любая неотрицательная функция «гарантированно будет частью стандарта в будущих версиях». Не ясно, что это подразумевалось, поэтому, возможно, потребуется изменить это определение.
и изменил значение осуждается чтобы:
Это устаревшие функции, где устаревшие определены как: Нормативные для текущей редакции Стандарта, но были определены как кандидаты на исключение из будущих редакций.
и позже эта функция была устаревшей из-за проблем совместимости C сообщение об ошибке 1012:
Хотя 7.3.1.1 [namespace.unnamed] утверждает, что использование статического ключевого слова для объявления переменных в области пространства имен не рекомендуется, поскольку пространство имен без имени обеспечивает превосходную альтернативу, маловероятно, что эта функция будет удалена в любой момент в обозримом будущем особенно в свете проблем совместимости с Си. Комитет должен рассмотреть вопрос об устранении амортизации.
Других решений пока нет …