C++ Как объявить класс как локальный для файла

Итак, я знаю, что статические функции - это функции, локальные для файла. Таким образом, они не могут быть доступны из других файлов. Это работает и для классов? Я прочитал массу противоречий о том, как static class не объявляет, что класс содержит чисто статические члены и методы (что очевидно), но не может найти ничего, в котором упоминалось бы, объявит ли это класс локально доступным для области действия файла, что более логично.

Если это не так, как насчет использования анонимного пространства имен, которое, как я слышал, также может быть использовано для объявления локальных функций файла?

2 ответа

Решение

Вы можете определить класс в безымянном пространстве имен, как, например,

namespace
{
    struct A {};
}

В этом случае имя класса будет иметь внутреннюю связь. То есть он виден только в модуле компиляции, где он определен, и все модули компиляции, которые включают это определение, будут иметь свои собственные определения классов.

Что касается спецификатора класса хранения static затем (7.1.1 Спецификаторы класса хранения)

5 Статический спецификатор может применяться только к именам переменных и функций и к анонимным объединениям

Это работает и для классов?

Нет такого "статического" ключевого слова для класса.


В качестве альтернативы "анонимному пространству имен" вы можете объявить класс (Foo) и его определение (реализацию) полностью в одном файле cpp. Единственный код, который может использовать этот класс, это код ниже этой декларации...

Файл X.cpp:

// Foo declared
class Foo
{
public:
   //...ctor
   //...dtor
   // etc.       
}

// ... Foo defined (implemented)
Foo::etc() { ... }


// implementation of X - only X has access to Foo.

Конец X.cpp.

And File X.hpp does not reference Foo.

Если впоследствии вы обнаружите столкновение имен (то есть компоновщик сообщает дубликат символа), ваш единственный выбор - изменить одно или другое имя.


В SO много вопросов и ответов об анонимных пространствах имен. Я осторожен с тем, какие вещи я вкладываю в одно, и согласен, что они могут предотвратить столкновение имен.

Я использовал обе техники.

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