6

使用 gcc/g++ 编译给定代码示例成功。call没有错误strchr,显然分配const char *char *.

我发现strchr声明为char * strchr(const char *, int)在两个不同的来源pubs.opengroup.orgcplusplus.com

如果strchr是为了抛弃 constness 而实现的,那为什么会这样呢?

如果目标是提供既适用于字符串char *又适用于const char *字符串的函数 - 它可以使用两个不同的函数名称来实现。

您能否对此进行更详尽的解释。

#include <string.h>

int main () {
    const char *str = "Sample string";
    char * ptr;

    //ptr = str;            //  Error: discards const qualifier - both on gcc and g++
    pch = strchr(str,'S');  //  Succeeds in assigning <const char *> to <char *>

    *pch = '4';             //  Runtime error: segmentation fault

    return 0;
}

使用 MSYS2/mingw-w64 gcc_v5.3.0 和 TDM-gcc32 v5.1.0 在 Win7 上进行了尝试。

4

1 回答 1

10

当你strchr用 a调用时,char*你想要一个char*back,这样你就不需要对结果进行强制转换。C 不支持函数重载,因此在 a和 astrchr中搜索使用相同的函数。它在所有情况下都返回一个非常量指针。如果你用 a 调用它,它基本上就是抛弃了,所以调用者有责任安全地使用它(例如,通过立即将结果分配给 a,以避免对返回的指针的任何不安全使用)。char*const char*const char*constconst char*

如果目标是提供同时适用于 char * 和 const char * 字符串的函数 - 它可以使用两个不同的函数名称来实现。

是的,本来可以,但不是那样做的。C 的原始版本根本不支持const,因此避免尝试修改字符串文字始终是程序员的责任。如果使用不同的函数名称,那么它会破坏现有的strchr安全使用的代码。const如果像这样的传统 C 代码突然停止编译,将会减慢新关键字的采用速度:

char arr[] = "foo bar";
*strchr(arr, 'r') = 'z';

“C 的精神”是它不会试图阻止你做不安全的事情,编写正确的代码是你的工作。

在 C++strchr中被重载以保持常量:

char* strchr(char*, int);
const char* strchr(const char*, int);

这意味着它会自动做正确的事情,并且意外地用strchr.

于 2016-01-17T19:03:38.427 回答