繁体   English   中英

关于char **参数的const char **参数警告

[英]const char** parameter warning about char** argument

在编译对以下函数的调用期间:

char* process_array_of_strings(const char** strings);

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

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

虽然该函数不会改变字符(因此是const),但它会复制指针数组以便修改字符指针本身,因此这里的常量指针绝对是不可取的。

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

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

process_array_of_strings((const char**) foo);

在这些情况下,你必须明确地说你知道你在做什么。

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

所以答案显然是你需要一个演员(明确的)。 我已经写了这个扩展,以便你可以完全理解警告出现的原因,这对你决定沉默时很重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM