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);?
原型不应该是
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)