c - 以灵活且不显眼的方式在 C 中扩展 API

标签 c api static-methods abstraction

我正在尝试向 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. 将函数设为静态。
  2. 用指向这些函数的指针创建一个 extern struct。在单独的 #include 文件中声明它,该文件可供扩展程序使用,但不适用于整个世界。
  3. 在您的扩展中使用结构

像这样:

// 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());

关于c - 以灵活且不显眼的方式在 C 中扩展 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7254278/

相关文章:

api - D 中基于任务的并行性

java - 如何将参数从另一个类传递给非静态方法?

c - C 中的 6 位二进制计数器(编译,但 Windows 遇到错误)

c - 为什么 ShellExecuteEx 不设置 SHELLEXECUTEINFO.hProcess 的值?

javascript - 如何从 omegle 上的 ip 获取地理数据作为返回?

python - Wunderground api 搜索栏

php - 在 PHP 中使用带有作用域解析运算符的变量

java - 修改Builder模式,这是一个好的做法吗?

在实模式下用 Bresenham 的线算法计数,汇编

无法在新文本框中显示文本输入