在编译对以下函数的调用期间:
char* process_array_of_strings(const char** strings);
当char**
作为参数传递时,GCC会抱怨:
note: expected ‘const char **’ but argument is of type ‘char **’
虽然函数不会改变字符(因此是const),但它会复制指针数组以便修改字符指针本身,因此这里的常量指针绝对是不可取的。
编译成功,程序似乎正常工作。那么程序员应该如何处理这个警告呢?
答案 0 :(得分:7)
使用强制转换显式转换,编译器会很高兴:
process_array_of_strings((const char**) foo);
在这些情况下,你必须明确说你知道自己在做什么。
答案 1 :(得分:4)
这就是为什么char **
在C ++中不会自动转换为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 *
而不会发出警告,但这不是语言的定义方式
所以答案显然是你需要一个演员(明确的)。我已经写了这个扩展,以便你可以完全理解警告出现的原因,这对你决定沉默时很重要。