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