我有以下情况:
函数创建一个字符串数组,然后将其传递给一堆其他函数。这些其他函数既不应该修改外部指针指向的指针,也不应该修改字符串本身,所以我把它们做了 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
可以选择匹配。 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 *
视为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++没有评论