为什么不strlen(..)期望const char * const str而不是const char *

时间:2012-07-26 16:55:22

标签: c++ string

我正在读这个:const char * const versus const char *?

<{1>}中的

strlen定义为:

string.h

如果我理解正确,strlen需要一个指向const的char的指针。不应该是:

size_t strlen ( const char * str );

这样可以确保strlen不能修改指针指向不同的指针吗?

或者,是这样的:

由于str指针将通过值传递给strlen,因此函数中对此指针的任何更改都不会更改源指针,因此它没关系..

...

3 个答案:

答案 0 :(得分:11)

如果你真的读过那个讨论,你应该明白第二个const对函数的外部行为没有影响。对于您,strlen的用户,无论是使用const char *还是const char *const参数声明它都没有任何区别。正如您所正确指出的那样,strlen可能对指针执行的任何修改只会影响strlen内指针的内部本地副本。无论参数是否以第二个strlen声明,您传递给const的参数指针都将保持不变。 (你的参数指针甚至不必是左值。)

第二个const只会影响函数内局部参数变量的内部行为,阻止strlen authors 修改该局部变量。他们是否想要以这种方式限制自己是非正式地说,他们自己的事业。它不以任何方式涉及strlen的用户。

事实上,由于顶级const限定符对函数类型没有影响,因此通常可以声明具有const char *参数的函数,然后使用const char *const参数定义它。编译器(链接器)仍将这些声明视为“匹配”。这意味着如果库作者如此需要,他们实际上可以使用strlen参数定义const char *const。他们根本就没有告诉你这个,因为这实际上是一个实现细节或strlen,即你不需要知道的事情。

答案 1 :(得分:2)

  

由于str指针将通过值传递给strlen,因此函数中对此指针的任何更改都不会更改源指针,因此它没关系..

是。这只是内部处理功能的限制。

  

这样可以确保strlen不能修改指针指向不同的指针吗?

不需要,指针按值传递。

答案 2 :(得分:2)

  

size_t strlen(const char * const str);

     

这样可以确保strlen不能修改指针指向不同的指针吗?

您自己解释了原因: strlen无法修改指针...

它不必要地对参数施加限制,可以在修改指针本身时用于计算长度,如下所示:

 size_t len = 0;
 while(*str)
 {
   ++len;
   ++str; //error if `const char *const str` is used!
 }

请参阅glibcstrlen()的实现,它修改指针本身:将其指定给可修改的指针类型。

另见OpenBSD lib实施:

size_t strlen(const char *str)
{
    const char *s;

    for (s = str; *s; ++s)
        ;
    return (s - str);
}

如果s=strstr类型,则const char * const会出错!