Звучит так, будто вы хотите, чтобы люди не вызывали эти функции напрямую, но позволяли людям вызывать их косвенно через указатели функций. Это достаточно просто: просто не объявляйте функции в вашем заголовочном файле. Вы можете объявлять и определять функции в исходном файле. c, и в этом же файле вы можете реализовать какой-либо способ «получить» указатели на функции, буквально возвращая их или устанавливая их как члены структуры Graph. , В вашем заголовочном файле будут доступны только те функции получения / установки.
Например, в вашем заголовке:
void SetupGraph(Graph* graph);
Затем реализация в вашем файле. c:
static void InitGraph(NVGcontext* vg, Graph* graph) {
// ...
}
static void DrawAxes(NVGcontext* vg, Axis* axisObject) {
// ...
}
// public
void SetupGraph(Graph* graph)
{
graph->init = InitGraph;
graph->drawAxes = DrawAxes;
}
Теперь внешние пользователи вашей библиотеки могут сделать это:
Graph graph;
SetupGraph(&graph);
NVGcontext vg;
graph.init(&vg, &graph);
Видите, они могут вызывать InitGraph()
косвенно, через указатель на функцию, установленный SetupGraph()
, но они никогда не смогут позвонить InitGraph()
напрямую, потому что не знают его имени.