为什么 C 与 C++ 相反,禁止在指针到指针的两个级别添加 const 限定
Why does C in contrast to C++ ban adding const-qualification to both levels of a pointer-to-pointer?
我有以下情况:
函数创建一个字符串数组,然后将其传递给一堆其他函数。这些其他函数既不应该修改外部指针指向的指针,也不应该修改字符串本身,所以我把它们做了 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++没有评论
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 创建一个棋盘格或"Interweave"两个链接列表。IE 更改两个链表的指针
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- C++两个对象,其中包含指向同一数组不同部分的指针
- 比较两个 constexpr 指针不是 constexpr?
- 在两个.cpp文件之间定义全局类/结构指针
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针
- 如何在单个链表中交换两个节点的位置,只修改指针
- 如何仅考虑 *指针中的前两个元素
- 如果将两个相同的指针作为输入传递,memcmp 会做什么?
- 一个对象的两个指针.删除了一个指针,对象仍然存在
- C++如何同时删除位于两个向量中的 2 个指针?
- 如何将值添加到嵌套结构中,该结构在C++中有两个指针
- 比较两个指针时">="运算符的奇怪行为
- 根据下面的作者,如果两个指针指向不同的数组,则比较的第一个版本将未定义
- 有没有更好的方法来添加两个智能指针?
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 为什么 fdump-class-hierarchy 为虚函数提供了两个指针 int vtable
- 两个类别的两个类,有指向另一堂课的指针
- 错误 :"+" 无法添加两个指针