strchr() 的返回类型非 const?

Cac*_*ito 6 c pointers glibc constants

在 Debian 9 上,使用 GCC 8.2、2.27 libc6-dev:amd64

strchr(以及许多其他函数)的手册页<string.h>具有以下原型:

   char *strchr(const char *s, int c);
Run Code Online (Sandbox Code Playgroud)

const char *当它的源是 a 时,它如何返回非, const char *

原型不应该是吗const char *strchr(const char *str, int c);

chu*_*ica 7

原型不应该是const char *strchr(const char *str, int c);

否,因为向后兼容性和更广泛的适用性。

在 C 的早期const并不存在,并且strchr()有效地像

char *strchr(char *str, int c);
Run Code Online (Sandbox Code Playgroud)

添加 后const,将str参数从char *to更改const char *不会破坏现有代码,而且可以很好地允许新代码传递char *const char *to strchr()。签名const中还表明strchr(const char *str, ...)没有改变 指向的数据str

返回会破坏现有代码const char *strchr()此外,当strchr()使用 a 调用时char *,返回 achar *就可以了。通过函数重载,就像在 C++ 中一样,两个函数都存在。

char *strchr(char *str, int c);
const char *strchr(const char *str, int c);
Run Code Online (Sandbox Code Playgroud)

同样的问题也适用于许多其他函数:strto...(), bsearch(), memchr(), strpbrk(), strrchr(), strstr(), ...


这是新代码的一个考虑因素,您是否应该开发一个返回从提供的指针派生的指针的函数:返回const或不返回,还是形成 2 函数(可能由 引导_Generic)?

const_or_not char *foo(const char *s)
Run Code Online (Sandbox Code Playgroud)