Как сделать функцию видимой через заголовочный файл в 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.