#c #header #visibility
#c #заголовок #видимость
Вопрос:
Я пишу библиотеку шаблонов только для заголовков на C . Я хочу иметь возможность написать некоторые вспомогательные функции внутри этого файла заголовка, которые не будут видны из файла cpp, включающего эту библиотеку заголовков. Есть какие-нибудь советы о том, как это сделать?
Я знаю, что ключевое слово static можно использовать в файлах cpp, чтобы ограничить видимость одной единицы перевода. Есть ли что-то подобное для заголовочных файлов?
Комментарии:
1. Вы можете использовать дополнительное внутреннее пространство имен. (хотя все еще виден).
2. Из C 20, с модулями, вы можете выбрать, что экспортируется.
3. Следует отметить, что модификаторы доступа и область действия не очень хорошо защищают код — вы должны предположить, что пользователь будет использовать недокументированные API, если они определены, и как можно лучше взаимодействовать с внутренним пространством имен с четким именем.
Ответ №1:
На самом деле нет никакого способа.
Соглашение заключается в использовании пространства имен для определений, которые не должны быть общедоступными. Типичные имена для этого пространства details
имен , означающие детали реализации или internal
внутренние для вашей библиотеки.
И, как упоминалось в комментариях, модули C 20 меняют эту ситуацию.
Комментарии:
1. Ваш ответ лучше, чем мой 🙂
Ответ №2:
Простой ответ-нет.
Заголовки не существуют для компоновщика, поэтому все функции в заголовках фактически находятся в модуле, который их включил. Технически статические (или анонимные пространства имен) функции в заголовке статичны для модуля, который их включил. Это может сработать, но в итоге вы получите несколько функций и раздутый размер кода.
Из — за этого вы всегда должны вставлять функции в файлы заголовков или использовать что-то, что подразумевает встроенное, например constexpr; Если возможно…
Функции в заголовках обычно полагаются либо на встроенные, либо на шаблонные. Шаблонная функция является «слабой», то есть компоновщик предполагает, что все они одинаковы, и просто использует случайную функцию, а остальные отбрасывает.