当给定 const char * 作为第一个参数时,C 标准库函数 strchr returns 指向非常量的指针怎么来的?
How come C standard library function `strchr` returns pointer to non-const, when given `const char *` as first argument?
使用 gcc/g++ 编译给定代码示例成功。 strchr
调用没有错误,这显然将 const char *
分配给 char *
.
我发现 strchr
在两个不同的来源上被声明为 char * strchr(const char *, int)
pubs.opengroup.org and cplusplus.com
如果 strchr
的实现是为了抛弃常量,那为什么会这样?
如果目标是提供同时适用于 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 上试过。
当您使用 char*
调用 strchr
时,您需要返回 char*
,这样您就不需要对结果进行转换。 C 不支持函数重载,因此相同的 strchr
函数用于在 char*
和 const char*
中进行搜索。它 returns 在所有情况下都是一个 non-const 指针。如果你用 const char*
调用它,它基本上是在抛弃 const
所以调用者有责任安全地使用它(例如,立即将结果分配给 const char*
,以避免任何返回指针的不安全使用)。
If goal was to provide function which works both on char * and const char * strings - it could have been implemented using two different function names.
是的,它本来可以,但它不是那样做的。 C 的原始版本根本不支持 const
,因此避免尝试修改字符串文字始终是程序员的责任。如果使用不同的函数名称,那么它会破坏安全使用 strchr
的现有代码。如果像这样的传统 C 代码突然停止编译,它会减缓新 const
关键字的采用:
char arr[] = "foo bar";
*strchr(arr, 'r') = 'z';
"spirit of C" 是它不会试图阻止你做不安全的事情,编写正确的代码是你的工作。
在 C++ 中 strchr
被重载以保持常量:
char* strchr(char*, int);
const char* strchr(const char*, int);
这意味着它会自动做正确的事情,并且使用 strchr
.
意外编写不安全代码要困难得多
使用 gcc/g++ 编译给定代码示例成功。 strchr
调用没有错误,这显然将 const char *
分配给 char *
.
我发现 strchr
在两个不同的来源上被声明为 char * strchr(const char *, int)
pubs.opengroup.org and cplusplus.com
如果 strchr
的实现是为了抛弃常量,那为什么会这样?
如果目标是提供同时适用于 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 上试过。
当您使用 char*
调用 strchr
时,您需要返回 char*
,这样您就不需要对结果进行转换。 C 不支持函数重载,因此相同的 strchr
函数用于在 char*
和 const char*
中进行搜索。它 returns 在所有情况下都是一个 non-const 指针。如果你用 const char*
调用它,它基本上是在抛弃 const
所以调用者有责任安全地使用它(例如,立即将结果分配给 const char*
,以避免任何返回指针的不安全使用)。
If goal was to provide function which works both on char * and const char * strings - it could have been implemented using two different function names.
是的,它本来可以,但它不是那样做的。 C 的原始版本根本不支持 const
,因此避免尝试修改字符串文字始终是程序员的责任。如果使用不同的函数名称,那么它会破坏安全使用 strchr
的现有代码。如果像这样的传统 C 代码突然停止编译,它会减缓新 const
关键字的采用:
char arr[] = "foo bar";
*strchr(arr, 'r') = 'z';
"spirit of C" 是它不会试图阻止你做不安全的事情,编写正确的代码是你的工作。
在 C++ 中 strchr
被重载以保持常量:
char* strchr(char*, int);
const char* strchr(const char*, int);
这意味着它会自动做正确的事情,并且使用 strchr
.