В дополнение к ответу Майка Кингхана (который охватывает большинство случаев), есть также (довольно необычная) причина объявить в заголовочном файле библиотеки функцию, не реализованную в этой библиотеке. Иногда эта библиотека ожидает плагин , и ожидается, что пользователь предоставит такой плагин (в некотором роде, возможно, передавая имя файла плагина какой-то другой функции). Библиотека будет использовать методы динамической загрузки (такие как dlopen (3) в Linux) для установки такого плагина. И он получит некоторую конкретную функцию (с dlsym (3) в Linux) из плагина. Тогда имеет смысл объявить , но не определить такую функцию плагина в заголовках библиотеки.
Я признаю, что этот случай необычен и надуман.
Для конкретного примера прочитайте о плагинах GCC . Ваш плагин должен #include "gcc-plugin.h"
, который косвенно объявляет
/* Declaration for "plugin_init" function so that it doesn't need to be
duplicated in every plugin. */
extern int plugin_init (struct plugin_name_args *plugin_info,
struct plugin_gcc_version *version);
но plugin_init
должно быть определено кодом вашего плагина. Тогда GCC будет dlopen
ваш плагин, используя что-то эквивалентное
void*plhdl = dlopen("/home/you/yourplugin.so", RTLD_NOW);
и позже получите указатель на функцию, используя
typeof(plugin_init)* funptr = dlsym(plhdl, "plugin_init");
Обратите внимание, что символ plugin_init
не не появляется в сегменте кода GCC.
Другим примером является инфраструктура Qt (набор библиотек). Читайте о плагинах Qt .