返回类型strchr()非常量?

时间:2019-03-19 00:35:22

标签: c pointers const glibc

在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);吗?

2 个答案:

答案 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,那就没问题了。