Является ли статическое устаревание при обеспечении доступности между единицами перевода?

Из следующего ответа 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] утверждает, что использование статического ключевого слова для объявления переменных в области пространства имен не рекомендуется, поскольку пространство имен без имени обеспечивает превосходную альтернативу, маловероятно, что эта функция будет удалена в любой момент в обозримом будущем. особенно в свете проблем совместимости с Си. Комитет должен рассмотреть вопрос об устранении амортизации.

Другие вопросы по тегам