std::strtol的签名

9
std::strtol的签名如下: long strtol(const char *str, char **str_end, int base); 我原本期望第二个参数的类型是const char**。为什么它实际上是char**类型呢?请注意,可以修改const char**类型的变量。您无法修改的是char* const *类型的变量。

这个函数会更改 str_end 指针,所以它必须是 char ** - ForceBru
可能是因为在C语言中函数是这样声明的,而C++希望保持兼容性。至于为什么在C语言中要这样声明,可能是为了向后兼容旧代码。关于具体原因,您需要向标准委员会咨询。 - Some programmer dude
@JoachimPileborg:这并没有太多意义,因为第一个参数是“const”。 - Billy ONeal
3
从答案中得知,许多人无法正确区分const char **char * const * - Lingxi
Billy ONeal。是的,但如果我有char foo [10] ="123z",*p; long l = strtol(foo,&p,10); * p = 0;,我会期望它能够工作。这与C搜索函数采用const char *但返回char *的原因相同。 - Martin Bonner supports Monica
@Martin:是的,我搞反了。 - Billy ONeal
1个回答

10

在古老的时代(在C90之前),C语言没有const的概念,一切都使用普通的char*

由于char*可以隐式转换为char const*,所以更改大多数库函数的签名以支持const并不是太大的问题。然而,char**不能转换为char const**,请参阅C++标准中的以下注释。

enter image description here

由于C语言不支持重载,委员会不得不在破坏遗留代码和强制每个人传入char**之间做出选择。两者都不是理想的选择,但看起来他们选择了后者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接