为什么在cstring.h中没有使用常量指针
Why does not used constant pointer at strcmp in cstring.h
在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)
(反之亦然)是完全有效的。
在您的示例中,即使s1
和s2
在strcmp
内部被修改,客户端也不会注意到这些修改,因为指针是按值传递的(复制到函数中)。也就是说,如果调用strcmp(a, b)
,那么即使更改了str1
和str2
, a
和b
也将保留其值。
正如其他人指出的那样,在《宣言》;我见过的最常见的会议是禁止。
在定义中确实有意义。但最常见的是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
使任何更安全?
并且,最有可能的是,实现更改了 s1
和s2
指针(可能在某些循环中,两个指针都加1以逐个比较每个char
)。
相关文章:
- 将常量指针引用绑定到非常量指针
- 如何使用数据对象上的常量指针初始化类
- 为什么我收到"从常量指针到指针的转换无效?
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 为什么C++中没有常量引用,就像常量指针一样?
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 将常量指针强制转换为非常量
- 带有常量指针的矢量构造函数示例
- 什么是常量指针常量引用类型的参数?(const X* const & p)
- 在多线程函数中返回共享的常量指针会导致计时问题吗?
- 常量指针上的混乱
- 使用 static_cast 时指向常量指针的原因
- 如何在C++中定义常量指针数组?
- 测试此指针的常量指针性质
- 当常量指针用作函数的参数时
- C++ - 无法将顶部常量指针分配给另一个非常量指针
- 在不同类型之间转换常量指针
- 解构常量指针?
- 为什么 std::vector<>::const_reference 可以转换为非常量指针?