Существует интересная проблема, связанная с этим:
Предположим, вы используете ключевое слово static
или без имени namespace
, чтобы сделать некоторую функцию внутренней для модуля (единицы перевода), поскольку эта функция предназначена для использованиявнутренне модулем и недоступным снаружи.(Безымянный namespace
s имеет преимущество в том, что он делает данные и определения типов внутренними, помимо функций).
Со временем исходный файл реализации вашего модуля становится большим, и вы хотели бы разделить егов несколько отдельных исходных файлов, которые позволили бы лучше организовать код, быстрее находить определения и компилироваться независимо.
Но теперь вы столкнулись с проблемой: эти функции больше не могут быть static
длямодуль, потому что static
фактически ссылается не на модуль , а на исходный файл (единица перевода).Вы вынуждены сделать их не static
, чтобы к ним можно было получить доступ из других частей (объектных файлов) этого модуля.Но это также означает, что они больше не являются скрытыми / закрытыми для модуля: имея внешнюю связь, они могут быть доступны из других модулей, что было не вашим первоначальным намерением.
Безымянный namespace
не решит и эту проблему, потому что он также определен для определенного исходного файла (единицы перевода) и не может быть доступен извне.
Было бы замечательно, если бы можно было указать, что некоторые namespace
private
, то есть все, что в нем определено, предназначено для внутреннего использования модулем, к которому он принадлежит.Но, конечно, в C ++ нет такого понятия, как «модули», только «единицы перевода», которые тесно связаны с исходными файлами.