3 ответов:
вы в основном ссылаетесь на раздел 7.3.1.1 $/2 из стандарта C++,
использовать ключевое слово static не рекомендуется при объявлении объектов в a область пространства имен; безымянный-пространство имен предоставляет улучшенный альтернатива.
Безымянное пространство имен превосходит статическое ключевое слово, прежде всего потому, что ключевое слово
staticприменяется только к переменные деклараций и функции, не к определенному пользователем типы.следующий код действителен в C++
//legal code static int sample_function() { /* function body */ } static int sample_variable;но этот код недействителен:
//illegal code static class sample_class { /* class body */ }; static struct sample_struct { /* struct body */ };Итак, решение, Безымянное пространство имен, которое является этим,
//legal code namespace { class sample_class { /* class body */ }; struct sample_struct { /* struct body */ }; }надеюсь, это объясняет, почему
unnamed-namespaceпревосходитstatic.
Кроме того, обратите внимание, что использование ключевого слова static не рекомендуется при объявлении объектов в области пространства имен (согласно стандарту).
стандарт C++ читает в разделе 7.3.1.1 безымянные пространства имен, пункт 2:
использовать ключевое слово static не рекомендуется при объявлении объектов в a область пространства имен, Безымянное пространство имен обеспечивает превосходную альтернативу.
Static применяется только к именам объектов, функций и анонимных объединений, а не к объявлениям типов.
существует интересная проблема, связанная с этим:
предположим, что вы используете
staticключевое слово или безымянныйnamespaceчтобы сделать некоторую функцию внутренней для модуля (единицы перевода), так как эта функция предназначена для внутреннего использования модулем и недоступна вне его. (Безымянныйnamespaces имеют преимущество в том, что определения данных и типов также являются внутренними, помимо функций).со временем исходный файл реализации вашего модуля становится большим, и вы хотели бы разделить его на несколько отдельных исходных файлов, что позволит лучше организовать код, быстрее найти определения и быть скомпилированным независимо.
но теперь вы столкнулись с проблемой: эти функции больше не могут быть
staticмодуль, потому чтоstaticна самом деле не относятся к модуль, но и исходный файл (ЕП). Вы вынуждены сделать их не -staticчтобы разрешить доступ к ним из другие части (объектные файлы) этого модуля. Но это также означает, что они больше не скрыты/приватны для модуля: имея внешнюю связь, они могут быть доступны из других модулей, что было не ваше первоначальное намерение.безымянный
namespaceтакже не решит эту проблему, поскольку она также определена для конкретного исходного файла (единицы перевода) и не может быть доступна извне.было бы здорово, если бы можно было указать, что некоторые
namespaceэтоprivate, то есть все, что определено в нем, предназначено для внутреннего использования модулем, к которому он принадлежит. Но, конечно, в C++ нет такого понятия как "модули", только "единиц", которые тесно связаны с исходными файлами.
Comments