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

У меня есть несколько файлов заголовков в библиотеке: header1.h, header2.h... У меня также есть общий заголовочный файл для библиотеки: mylib.h

Я хочу, чтобы пользователь импортировал main.h файл и получить доступ только к некоторым функциям в других заголовочных файлах.

Например, в библиотеке:

// header1.h
void a(void);
void b(void);

-

// mylib.h

// I can't use this:
#include "header1.h"
// because it would make b function visible.

// Link to function a ????????

И в моей основной программе:

// main.c
#include "mylib.h"

int main(void) {

    a(); // Visible: no problem
    b(); // Not visible: error

    return 0;
}

3 ответа

Решение

Разделите прототипы функций на разные заголовки, в зависимости от того, должны ли они быть "видимыми" * 1 или нет (но быть "внутренними").

  • header1_internal.h
  • header1.h
  • header2_internal.h
  • header2.h
  • ...

Включить в *_internal.h заголовки связанные *.h заголовок.

Включить *_internal.h Заголовки в связанные модули вашей библиотеки.

Не включайте *_internal.h в mylib.h,


*1: Обратите внимание, что даже если вы не предоставите прототип таким образом, пользователь может очень хорошо создать свой собственный прототип и затем связать функцию с mylib , Таким образом, функции, не являющиеся прототипами, не являются недоступными.

Если void b(void) не нужен другому заголовочному файлу, и у вас есть доступ к исходному файлу, как насчет перемещения объявления в исходный файл?

// header1.h
void a(void);
//void b(void);

// header1.c
/* some #include here */
void b(void);
/* other code here */
void b(void) {
    /* implement it */
}

Заголовочные файлы содержат только те функции, которые должны быть доступны пользователю заголовка. Они представляют публичный интерфейс.

Посмотрите сначала: организация кода в несколько файлов 1 Ссылка на YouTube: организация кода в несколько файлов 1

Организация кода в несколько файлов 2 Ссылка на YouTube: Организация кода в несколько файлов 2

Кроме того, вы можете обратиться к разделу Введение в GCC Брайана Гофа, чтобы получить более подробную информацию о процессе компиляции и компоновки с использованием gcc.

Другие вопросы по тегам