这就是为什么在 C++char **
中不会自动转换为const char **
,以及 C 编译器在允许时发出警告的原因。
/* This function returns a pointer to a string through its output parameter: */
void get_some_string(const char ** p) {
/* I can do this because p is const char **, so the string won't be modified. */
*p = "unchangeable string in program core";
}
void f() {
char * str;
/* First, I'll call this function to obtain a pointer to a string: */
get_some_string(&str);
/* Now, modify the string: */
for (char * p = str; *p; p++)
*p = toupper(*p);
/* We have just overwritten a constant string in program core (or crashed). */
}
根据您对做什么的描述process_array_of_strings()
,它也可以采用,const char * const *
因为它既不修改指针也不修改字符(但在其他地方复制了指针)。在这种情况下,上述情况是不可能的,并且编译器理论上可以允许您在没有警告的情况下自动转换char **
为const char * const *
,但这不是语言的定义方式。
所以答案显然是你需要一个演员(显式)。我写了这个扩展,以便您可以完全理解为什么会出现警告,这在您决定静音时很重要。