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

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

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

4

Решение

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

namespace
{
struct A {};
}

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

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

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

14

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

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

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


В качестве альтернативы «анонимному пространству имен» вы можете объявить класс (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.

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


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

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

1

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