我有以下情况:
一个函数创建一个字符串数组,然后将其传递给一堆其他函数。这些其他函数不应修改外部指针指向的指针或字符串本身,因此我将它们设为常量。
最小的例子:
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 *
视为 中的
- 这只是 C 不允许的情况。const1 char *
function()
#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/