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

Из следующего ответ на стек, пользователь говорит:

Это означает, что переменная является локальной для единицы перевода (проще говоря,
к одному исходному файлу), и не могут быть доступны извне. это
использование статики фактически не рекомендуется в текущем стандарте C ++ —
вместо этого вы должны использовать анонимные пространства имен:

static int x = 0;

должно быть:

namespace {
int x = 0;
}

Я не согласен, что анонимные пространства имен являются предпочтительным методом,
но действительно ли использование статики сейчас устарело?
Где стандарт говорит это?

3

Решение

Нет, в настоящее время это не рекомендуется. Это было когда-то, но это было полностью изменено из-за проблем сравнимости C. В некоторый момент до 1999 года это устарело, и это привело к отчет о дефекте 174 который говорит:

Решение об отказе от глобальной статики должно быть отменено.

  • Мы не можем отказываться от static, потому что это важная часть C, и отказ от нее сделает C ++ излишне несовместимым с C.
  • Поскольку шаблоны могут быть созданы на членах безымянных пространств имен, некоторые системы компиляции могут помещать такие символы в
    глобальное пространство линкера, которое может наложить значительное бремя на
    линкер. Без статики программисты не имеют механизма, чтобы избежать
    бремя.

Это приводит к отчет о дефектах 223 в котором смысл неодобрение был пересмотрен с:

устарела определяется как: Норматив для текущей редакции Стандарта, но не гарантируется, что он станет частью Стандарта в будущих редакциях

было отмечено, что это подразумевает, что только будущие функции будут поддерживаться в будущих стандартах:

Тем не менее, это определение, по-видимому, говорит о том, что любая неотрицательная функция «гарантированно будет частью стандарта в будущих версиях». Не ясно, что это подразумевалось, поэтому, возможно, потребуется изменить это определение.

и изменил значение осуждается чтобы:

Это устаревшие функции, где устаревшие определены как: Нормативные для текущей редакции Стандарта, но были определены как кандидаты на исключение из будущих редакций.

и позже эта функция была устаревшей из-за проблем совместимости C сообщение об ошибке 1012:

Хотя 7.3.1.1 [namespace.unnamed] утверждает, что использование статического ключевого слова для объявления переменных в области пространства имен не рекомендуется, поскольку пространство имен без имени обеспечивает превосходную альтернативу, маловероятно, что эта функция будет удалена в любой момент в обозримом будущем особенно в свете проблем совместимости с Си. Комитет должен рассмотреть вопрос об устранении амортизации.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]