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 много вопросов и ответов об анонимных пространствах имен. Я осторожен с тем, какие вещи я вкладываю в одно, и согласен, что они могут предотвратить столкновение имен.
Я использовал обе техники.