c++ - 为什么与 C++ 相比,C 禁止向指针到指针的两个级别添加 const 限定?

标签 c++ c pointers constants pointer-to-pointer

我有以下情况:

一个函数创建一个字符串数组,然后将其传递给一堆其他函数。这些其他函数不应修改外部指针指向的指针或字符串本身,因此我将它们设为常量。

最小的例子:

void function(const char * const *arr) {
    /* Do something useful */
}

int main(void) {
    char **x;
    /* fill x and *x */
    function(x);
}

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

虽然我理解为什么如果我删除函数参数列表中的第二个 const 指针类型不兼容(此处解释:Why does passing char** as const char** generate a warning?),但我不明白为什么它与 const 不兼容。

用 c++-Compiler 编译没有给我警告(参见这里的比较:https://gcc.godbolt.org/z/YND5U7)

最佳答案

I do not understand why it is incompatible with the const.

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

在C语言中,const1 char * const2 *arr中的const2是限定符x可选匹配。 const2 表示 function(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 * 视为 中的 const1 char * function() - 这只是 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++无评论

关于c++ - 为什么与 C++ 相比,C 禁止向指针到指针的两个级别添加 const 限定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54033889/

相关文章:

c - 标准库 include 应该写在哪里? .c 还是 .h 文件?

c# - 在 Windows 上以编程方式重命名打开的文件

c++ - 为什么我可以从 const 方法调用更改成员的方法?

c - 如何破译 C 中的复杂指针声明?

c++ - 提高 C++ 的性能

请求变量时的 C++ 调用函数

c++ - 运算符[][] C++

c++ - boost::interprocess 共享内存删除对象而不破坏

c - C中int数组的初始值

C++ 指针在函数调用后在继承中失去值(value)。