在Debian 9上,GCC 8.2,libc6-dev:amd64
2.27:
strchr
(和许多其他<string.h>
函数)的手册页有这个原型:
char *strchr(const char *s, int c);
当它的来源是const
时,如何返回非char *
const char *
?
原型不应该是const char *strchr(const char *str, int c);
吗?
原型不应该是const char * strchr(const char * str,int c);
由于向后兼容性和更广泛的适用性。
在C的早期,qazxsw poi不存在,而qazxsw poi实际上就像
const
随着strchr()
的加入,将char *strchr(char *str, int c);
的论点更改为const
并没有破坏现有的代码,但很好地允许新代码将char *
或const char *
传递给char *
。签名中的const char *
也表明strchr()
没有改变const
指出的数据。
从strchr(const char *str, ...)
返回str
会破坏现有的代码。进一步当用const char *
召唤strchr()
时,返回strchr()
很好。使用函数重载,如在C ++中,两个函数都存在。
char *
同样的问题适用于许多其他功能:char *
如果您开发了一个返回从提供的指针派生的指针的函数,那么这是新代码的考虑因素:返回char *strchr(char *str, int c);
const char *strchr(const char *str, int c);
与否,或者形成2个函数?
strto...(), bsearch(), memchr(), strpbrk(), strrchr(), strstr(), ...
在这种情况下,const
只是表明const_or_not char *foo(const char *s)
不会改变你的字符串。由调用者决定是否可以修改字符串。
EG
const
将是非法的,但如果该参数不是strchr
它会没事的。