前向兼容接口的功能签名更改

时间:2014-07-07 14:49:32

标签: c macros libraries

在保持向前兼容的同时,如何扩展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 */

这样可以避免在实践中使用令人讨厌的名字。

是否有任何常见的做法如何处理冲突的前向兼容性和未来版本的优雅代码?关于过去流行的C API如何处理的任何例子都将受到赞赏。

编辑:不幸的是我没有明确提到这一点:foo(int)签名已经设置好,因此引入varargs / struct参数也是一个不兼容的API更改。实际上很可能很多功能都会随着时间而改变,但有些功能最终会发生变化。使用不常见的签名支付所有功能对我来说似乎是一个很高的代价。

3 个答案:

答案 0 :(得分:3)

将指针传递给结构......

typedef struct
{
    int value;
} typeStructure;

void foo(const typeStructure * const pTypeStructure);

typeStructure应该展开,foo的旧版本只会忽略新字段。

答案 1 :(得分:2)

你可以创建一个变量函数:

void foo(int arg, ...);

在第一个实现中,您只需使用第一个参数。在将来的版本中(可能以arg具有特定值为条件),您可以使用va_arg来访问更多参数。

答案 2 :(得分:0)

使用foo();。 括号内没有参数意味着未指定数量的参数,您可以使用任意数量的参数调用它。

其他方式是va_args变量参数函数,如printf(),或变量宏,它将调用您的foo

#define FOO(...) foo(__VA_ARGS_)