Расширение API в C гибким и ненавязчивым способом - PullRequest
1 голос
/ 31 августа 2011

Я пытаюсь добавить некоторые дополнительные функции в API. Однако я хотел бы, чтобы эти дополнительные функции были в моей внешней библиотеке и не смешивались с исходным библиотечным кодом.

Проблема возникает, когда мне нужно получить доступ к статическим функциям упомянутого API из моих функций. Конечно, я не могу, поэтому единственное решение, которое я вижу, это либо скопировать код этих функций в мой API, либо сделать их нестатичными в исходном API. Оба варианта не слишком удачные для меня по понятным причинам.

Точнее:

original_api.c
  void some_function() -> uses some_helper_function()  
  static some_helper_function()

my_api_extension.c
  void some_extended_function() -> needs to use some_helper_function from original_api.c, but can't

Не могли бы вы предложить наиболее гибкий способ справиться с этим?

Я хотел бы отметить, что это относится только к C, а не к C ++.

1 Ответ

1 голос
/ 31 августа 2011
  1. Сделать функции статичными.
  2. Создайте extern struct с указателями на эти функции. Объявите его в отдельном файле #include, доступном расширению, но не всему миру.
  3. Используйте struct в вашем добавочном номере.

Примерно так:

// in the private header
typedef struct
{
  void (*p_myfunc1)(int);
  int (*p_myfunc2)(void);
} privateAPI_t;
extern privateAPI_t privateAPI;

// in the library
static void myfunc1(int);
static int myfunc2(void);

privateAPI_t privateAPI = { myfunc1, myfunc2 };

// in the extension
#include <privateAPI.h>
...
privateAPI.p_myfunc1(privateAPI.p_myfunc2());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...