为什么在cstring.h中没有在strcmp中使用常量指针

时间:2014-03-28 12:59:53

标签: c++ string const

在cstring.h文件中有一个函数:

int strcmp ( const char *s1, const char *s2 ),但为什么只有数据是常量,使指针和数据都不变更安全。在我看来,正确版本的函数应该是这样的:

int strcmp ( const char * const s1, const char * const s2 )

3 个答案:

答案 0 :(得分:7)

参数的顶级const修饰符将从声明中删除,因为它们与客户端无关。参数是否更改是实现细节。将函数声明为void f(int x)然后将其定义为void f(const int x)(反之亦然)完全有效。

在您的示例中,即使在s1内修改了s2strcmp,客户端也不会注意到这些修改,因为指针是按值传递的(复制到函数中) 。也就是说,如果您致电strcmp(a, b),则ab将保留其值,即使str1str2已更改。

答案 1 :(得分:2)

正如其他人所指出的那样,顶级const被忽略了 宣言;我见过的最常见的惯例 禁止它。

它在定义中确实有意义。但最常见的 strcmp的实现类似于:

int
strcmp( char const* s1, char const* s2 )
{
    while ( *s1 != '\0' && *s2 != '\0' && *s1 == *s2 ) {
        ++ s1;
        ++ s2;
    }
    return (unsigned char)( *s1 ) - (unsigned char)( *s2 );
}

参数不是 const。

答案 2 :(得分:1)

没有必要。在复制指针时,我不知道如何再添加一个const使得更安全的东西?

而且,很可能,实现更改 s1s2指针(可能在某个循环中,递增两个指针以比较每个char,一个一个)。