Превосходство неназванного пространства имен над статическим?



как безымянные пространства имен превосходят static ключевое слово?

499   3  

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

    Ничего не найдено.