gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:54:51 28 4
gpt4 key购买 nike

我有以下情况:

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

最小的例子:

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com