在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);
吗?
答案 0 :(得分:3)
原型应该不是const char * strchr(const char * str,int c);
否,因为向后兼容和更广泛的适用性。
在C的早期,const
不存在,而strchr()
就像是有效的
char *strchr(char *str, int c);
通过添加const
,将参数从char *
更改为const char *
不会破坏现有代码,但是很好地允许新代码传递char *
或{{1} }至const char *
。签名中的strchr()
也表明const
并没有改变strchr(const char *str, ...)
指向的数据。
从str
返回const char *
会破坏现有代码。此外,当用strchr()
调用strchr()
时,返回char *
很好。与C ++一样,使用函数重载,两个函数都存在。
char *
同一问题也适用于许多其他功能:char *strchr(char *str, int c);
const char *strchr(const char *str, int c);
这是新代码的考虑因素,您是否应该开发一个返回从提供的指针派生的指针的函数:是否返回strto...(), bsearch(), memchr(), strpbrk(), strrchr(), strstr(), ...
或形成2个函数?
const
答案 1 :(得分:2)
在这种情况下,const
仅表示strchr
不会更改您的字符串。调用者可以确定字符串是否可以修改。
例如
void myFn(const char* param)
{
char* p = strchr(param, 'A');
/* I know there should be a NULL check too ;-) */
*p = 'Z';
}
将是非法的,但是如果参数不是const
,那就没问题了。