Итак, я знаю, что статические функции — это функции, локальные для файла. Таким образом, они не могут быть доступны из других файлов. Это работает и для классов? Я прочитал массу противоречий о том, как static class
не объявляет, что класс содержит чисто статические члены и методы (что очевидно), но не может найти ничего, в котором упоминалось бы, объявит ли это класс локально доступным для области действия файла, что более логично.
Если это не так, как насчет использования анонимного пространства имен, которое, как я слышал, также может быть использовано для объявления локальных функций файла?
Вы можете определить класс в безымянном пространстве имен, как, например,
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.
Если впоследствии вы обнаружите столкновение имен (то есть, компоновщик сообщает о повторяющемся символе), ваш единственный выбор — изменить одно или другое имя.
Есть много Q&А в SO насчет анонимных пространств имен. Я осторожен с тем, какие вещи я вкладываю в одно, и согласен, что они могут предотвратить конфликт имен.
Я использовал обе техники.