3

在编译调用以下函数的过程中:

char* process_array_of_strings(const char** strings);

char**当 a作为参数传递时, GCC 会抱怨:

note: expected ‘const char **’ but argument is of type ‘char **’

虽然该函数不会更改字符(因此是 const),但它确实复制了指针数组以修改字符指针本身,因此这里绝对不希望使用常量指针。

编译成功,程序似乎可以工作。那么程序员应该如何处理这个警告呢?

4

2 回答 2

7

使用强制转换使转换显式,编译器会很高兴:

process_array_of_strings((const char**) foo);

在这些情况下,您必须明确表示您知道自己在做什么。

于 2012-11-25T19:02:52.960 回答
4

这就是为什么在 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 *,但这不是语言的定义方式。

所以答案显然是你需要一个演员(显式)。我写了这个扩展,以便您可以完全理解为什么会出现警告,这在您决定静音时很重要。

于 2012-11-25T19:24:32.400 回答