首页 > 解决方案 > 这个函数可以兼容两个版本的 POSIX 吗?

问题描述

这是的概要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?如何?

标签: cposix

解决方案


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

正如POSIX 描述strspn所说

本参考页上描述的功能符合 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.txt。POSIX中的当前版本strspn(相当隐晦地)将此称为“ SD5-XSH- ERN- 182 应用在“更改历史记录”部分。)

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


推荐阅读