【问题标题】:Can this function be compliant with two versions of POSIX?这个函数可以兼容两个版本的 POSIX 吗?
【发布时间】:2019-06-28 16:41:00
【问题描述】:

这是strspn的概要:

#include <string.h>

size_t strspn(const char *s1, const char *s2);

这是 POSIX.1-2001 的描述和返回值:

strspn() 函数应计算 s1 指向的字符串的最大初始段的长度(以字节为单位),该长度完全由 s2 指向的字符串中的字节组成。

strspn()函数应该返回s1的长度;没有保留返回值来指示错误。

这与 POSIX.1-2017 (几乎)相同:

strspn() 函数应计算 s1 指向的字符串的最大初始段的长度(以字节为单位),该长度完全由 s2 指向的字符串中的字节组成。

strspn() 函数应返回计算长度;没有保留返回值来指示错误。

strspn 的实现是否可以同时兼容 POSIX.1-2001 和 POSIX.1-2017?怎么样?

【问题讨论】:

    标签: c posix


    【解决方案1】:

    这是 POSIX.1-2001 中的一个错误。

    作为the POSIX description of strspn says:

    此参考页面上描述的功能符合 ISO C 标准。此处描述的要求与 ISO C 标准之间的任何冲突都是无意的。本卷 IEEE Std 1003.1-2001 遵循 ISO C 标准。

    而 C 标准(ISO 9899:1999, 7.21.5.6 strspn 函数)明确表示:

    strspn 函数返回段的长度。

    较新版本的 POSIX 修正了措辞,使其与 C 标准表达相同的意思,这也是我们一直想要的。 (它显然在 2006 年被注意到并更改了;请参阅 https://www.opengroup.org/austin/docs/austin_330.txtcurrent version of strspn in POSIX 在更改历史记录部分中将此(相当隐晦地)称为“SD5-XSH-ERN-182 已应用” .)

    正如 POSIX 所说的“遵循 ISO C 标准”,我相信当出现冲突时(例如这种情况),兼容的实现必须遵循 C 标准。

    【讨论】:

    • strspn() 的 1997 年 POSIX 规范在同一页面上没有“遵循 C 标准”免责声明——但确实有错误的措辞。 strspn() 的在线 C11 规范来自标准的 N1570 草案。 C99 等效项是 strspn(),来自标准的 N1256 草案。
    • 顺便说一句,更改历史记录中的前一个条目很有趣:“返回值部分已更新以指示strspn() 返回s 的长度,而不是@987654336 @本身如前所述。" 1、strspn的描述中没有s,只有s1s2。 2.strspn不返回任何一个参数的长度。
    • 寻找勘误通知的好方法!
    【解决方案2】:

    是的,计算的长度s1的长度经常会不同,这意味着函数必须违反这些描述之一。

    但第一个显然是措辞错误,因为肯定是后者的意思,所以没关系

    没有多少人可以断言strspn()strlen() 的笨拙廉价仿冒品。

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 2015-02-20
      • 2016-12-27
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多