为什么 C 与 C++ 相反,禁止在指针到指针的两个级别添加 const 限定



我有以下情况:

函数创建一个字符串数组,然后将其传递给一堆其他函数。这些其他函数既不应该修改外部指针指向的指针,也不应该修改字符串本身,所以我把它们做了 const。

最小示例:

void function(const char * const *arr) {
    /* Do something useful */
}
int main(void) {
    char **x;
    /* fill x and *x */
    function(x);
}

当使用 gcc 或 clang 编译时,这给了我一个警告,x 被转换为不兼容的指针类型。

虽然我理解为什么如果我删除函数参数列表中的第二个 const 指针类型不兼容(在这里解释:为什么将 char** 作为 const char** 传递会产生警告?),但我不明白为什么它与 const 不兼容。

使用 c++ 编译器编译不会给我警告(请参阅此处的比较:https://gcc.godbolt.org/z/YND5U7)

我不明白为什么它与const不兼容.

注意:const1, const2定义是为了清楚起见,以区分两者。

在 C 中,const1 char * const2 *arr 中的const2是限定符x可以选择匹配。 const2function(const1 char * const2 *arr)与调用代码有合同,它不会改变arr指向的内容。 arr指向一个const1 char *arr可以是const1 char **的,也可以是const1 char * const2 *的。

main()中,不兼容,因为*x指向char *而不是const1 char *。 它所指向的与function()期望的不同。 const1不是function()无写合同的一部分。 相反,const1 char *是一种类型,与char *不同。

在这一点上,我认为没有理由不能以不同的方式指定 C 以允许将char *视为function()中的const1 char * - 这只是 C 不允许的情况。

#define const1 const
#define const2 const
void function(const1 char * const2 *arr) {
    // Do something useful
}
int main(void) {
    char **x = 0;
    function(x);  // bad  
    // note: expected 'const char * const*' but argument is of type 'char **'
    const char **x2 = 0;
    function(x2); // OK
}

C++没有评论

相关内容

最新更新