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

Why does not used constant pointer at strcmp in cstring.h

本文关键字:常量 指针 cstring 为什么      更新时间:2023-10-16

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

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

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

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

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

正如其他人指出的那样,在《宣言》;我见过的最常见的会议是禁止。

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

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

不const。

没必要。由于指针被复制,我不知道如何增加一个const使任何更安全?

并且,最有可能的是,实现更改了 s1s2指针(可能在某些循环中,两个指针都加1以逐个比较每个char)。