c - 向前兼容接口(interface)的函数签名更改

标签 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 */

这将避免在实践中使用讨厌的名称。

是否有任何常见的做法来处理 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/

相关文章:

C 结构和指针程序在编译时什么都不做。不显示错误或警告

macros - 如何避免在 defmacro 中进行评估?

c++ - 宏中的换行符 #

c - #define with parameters...为什么这样工作?

c - 链接静态库 C

java - 如何将本地jar文件添加到Maven项目中?

c++ - 简单的 fopen 和 fprintf 不工作

c - 初始化二维数组的函数

java - Eclipse 添加外部 jar 无法将它们添加为引用库

c - 将char存入char矩阵(C编程)