gpt4 book ai didi

c - 语义版本控制 : minor or major change?

转载 作者:太空狗 更新时间:2023-10-29 15:01:43 25 4
gpt4 key购买 nike

semantic versioning一般规则是仅在引入向后兼容功能时才增加次要编号,否则必须增加主要编号。 same approach ,但具有不同的算法,由 libtool 使用。

我有一个问题,关于什么是向后兼容的更改,什么不是。

假设我写了一个库,这个库的公共(public)头文件包含一个名为foo 的数据类型的typedef。在版本 1.0.0 中,这个 typedef 看起来像这样:

typedef struct foo_t {
int x;
int y;
} foo;

然后我决定更改数据类型,在下一个版本中它看起来像这样:

typedef struct foo_t {
int x;
int y;
int z;
} foo;

我只在结构foo_t 中添加了一个字段。这似乎是一个向后兼容的更改,但上面的结构现在事实上是另一个结构。我所做的并不是引入一个新功能而保留所有其他功能不变,而是我更改了一些已经存在的东西。

上述数据类型通常用于与库函数交换数据,但用户可能将其用于其他目的。如果用户使用 1.0.0 版编写了程序并且最后的更改构成了向后兼容的更改,则用户的程序也必须使用这个新版本进行编译。

这个新版本将如何命名,1.1.0 还是 2.0.0?

编辑

您可以阅读此讨论的进一步发展 here .

最佳答案

这将是一个主要的版本更改。结构布局被嵌入到最终用户程序中。添加成员是一项重大更改;无论哪种方式,布局都发生了变化。

引自Linux Program Library HOWTO — §3.6。不兼容的库:

When a new version of a library is binary-incompatible with the old one the soname needs to change. In C, there are four basic reasons that a library would cease to be binary compatible:

  1. The behavior of a function changes so that it no longer meets its original specification,

  2. Exported data items change (exception: adding optional items to the ends of structures is okay, as long as those structures are only allocated within the library).

  3. An exported function is removed.

  4. The interface of an exported function changes.

你说,“上面的数据类型通常用于与库的函数交换数据,但是用户可能将它用于其他目的。”如果该结构仅在内部使用而不在公共(public) API 中公开,您就可以了。但听起来用户可以自己分配一个结构变量,这意味着这是一个重大变化。

您可以使用 opaque structs 保护您的图书馆免受此类流失的影响.隐藏结构的内容,让用户只传递指针。这正是 FILE * 的工作原理:C 标准没有定义 FILE 的布局,我们作为最终用户不知道它里面有什么。

关于c - 语义版本控制 : minor or major change?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55088064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com