Как скрыть функции в заголовочных файлах C

#c #header #visibility

#c #заголовок #видимость

Вопрос:

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

Я знаю, что ключевое слово static можно использовать в файлах cpp, чтобы ограничить видимость одной единицы перевода. Есть ли что-то подобное для заголовочных файлов?

Комментарии:

1. Вы можете использовать дополнительное внутреннее пространство имен. (хотя все еще виден).

2. Из C 20, с модулями, вы можете выбрать, что экспортируется.

3. Следует отметить, что модификаторы доступа и область действия не очень хорошо защищают код — вы должны предположить, что пользователь будет использовать недокументированные API, если они определены, и как можно лучше взаимодействовать с внутренним пространством имен с четким именем.

Ответ №1:

На самом деле нет никакого способа.

Соглашение заключается в использовании пространства имен для определений, которые не должны быть общедоступными. Типичные имена для этого пространства details имен , означающие детали реализации или internal внутренние для вашей библиотеки.

И, как упоминалось в комментариях, модули C 20 меняют эту ситуацию.

Комментарии:

1. Ваш ответ лучше, чем мой 🙂

Ответ №2:

Простой ответ-нет.
Заголовки не существуют для компоновщика, поэтому все функции в заголовках фактически находятся в модуле, который их включил. Технически статические (или анонимные пространства имен) функции в заголовке статичны для модуля, который их включил. Это может сработать, но в итоге вы получите несколько функций и раздутый размер кода.

Из — за этого вы всегда должны вставлять функции в файлы заголовков или использовать что-то, что подразумевает встроенное, например constexpr; Если возможно…
Функции в заголовках обычно полагаются либо на встроенные, либо на шаблонные. Шаблонная функция является «слабой», то есть компоновщик предполагает, что все они одинаковы, и просто использует случайную функцию, а остальные отбрасывает.