在保持向前兼容的同时,是否存在如何扩展 C API 的常见做法?
假设我想在 c 库中提供一个函数 foo:
foo(int value);
现在在以后的版本中,我想扩展 foo 以允许另一个参数。
foo(int value, const char *description_may_be_NULL);
为了确保向前兼容性,我必须以不同的方式命名新的,例如foo2
.
提供这样的宏会不会很聪明:
#define MYLIB_API 2
#include <mylib.h>
/* the header will #define foo foo2 */
这将避免在实践中使用讨厌的名称。
是否有任何常见的做法来处理 future 版本的向前兼容性和优雅代码的冲突?任何有关流行的 C API 在过去如何处理的示例都将不胜感激。
编辑:不幸的是我没有明确提到这一点:foo(int)
签名已经设置,因此引入可变参数/结构参数也将是不兼容的 API 更改。许多功能实际上不太可能随时间改变,但有些功能最终会改变。对我来说,为所有具有不常见签名的功能提前付费似乎是一个高昂的代价。
最佳答案
传递一个指向结构的指针...
typedef struct
{
int value;
} typeStructure;
void foo(const typeStructure * const pTypeStructure);
如果 typeStructure
被扩展,旧版本的 foo
将简单地忽略新字段。
关于c - 向前兼容接口(interface)的函数签名更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24613477/