在cstring.h文件中有一个函数:
int strcmp ( const char *s1, const char *s2 )
,但为什么只有数据是常量,使指针和数据都不变更安全。在我看来,正确版本的函数应该是这样的:
int strcmp ( const char * const s1, const char * const s2 )
答案 0 :(得分:7)
参数的顶级const修饰符将从声明中删除,因为它们与客户端无关。参数是否更改是实现细节。将函数声明为void f(int x)
然后将其定义为void f(const int x)
(反之亦然)完全有效。
在您的示例中,即使在s1
内修改了s2
和strcmp
,客户端也不会注意到这些修改,因为指针是按值传递的(复制到函数中) 。也就是说,如果您致电strcmp(a, b)
,则a
和b
将保留其值,即使str1
和str2
已更改。
答案 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
使得更安全的东西?
而且,很可能,实现更改 s1
和s2
指针(可能在某个循环中,递增两个指针以比较每个char
,一个一个)。