C和C++不完全数组指针转换规则的区别
Difference in incomplete array pointer conversion rules between C and C++
当我用 gcc
和 g++
编译以下代码时,g++
给出错误而不是 gcc
。请注意,代码从 int (*)[4]
转换为 int (*)[]
(这是指向不完整数组类型的指针)。
int arr[4];
int (*p_arr)[] = &arr;
如 中所述,C
语言允许这种转换。但是为什么 C++
不允许这样做并给出错误 error: cannot convert ‘int (*)[4]’ to ‘int (*)[]’ in assignment
。我知道 C++ 比 C 更类型安全,但是这个赋值真的是类型不安全的,因为后来对指针的取消引用(例如 sizeof(*p_arr)
)无论如何也会在 C
中给出错误?
是的,这个赋值确实是类型不安全的。
在 C++ 中,数组类型包括维度。总是。
(大部分。)
转换本身是安全的,但请记住,C 语言中允许这种转换的相同规则也允许相反方向的转换。
int main() {
int array[4] = {0};
int (*ptr4)[4] = &array;
int (*ptrN)[] = ptr4;
int (*ptr5)[5] = ptrN; /* oh dear */
}
这显然很糟糕。 C++ 已经删除了这条规则,说 int[4]
和 int[]
是兼容类型的规则,并且几乎摆脱了兼容类型的概念。
一些安全的特定转换are being considered for inclusion in a future version of C++。它们也包括您的转化。
当我用 gcc
和 g++
编译以下代码时,g++
给出错误而不是 gcc
。请注意,代码从 int (*)[4]
转换为 int (*)[]
(这是指向不完整数组类型的指针)。
int arr[4];
int (*p_arr)[] = &arr;
如 C
语言允许这种转换。但是为什么 C++
不允许这样做并给出错误 error: cannot convert ‘int (*)[4]’ to ‘int (*)[]’ in assignment
。我知道 C++ 比 C 更类型安全,但是这个赋值真的是类型不安全的,因为后来对指针的取消引用(例如 sizeof(*p_arr)
)无论如何也会在 C
中给出错误?
是的,这个赋值确实是类型不安全的。
在 C++ 中,数组类型包括维度。总是。
(大部分。)
转换本身是安全的,但请记住,C 语言中允许这种转换的相同规则也允许相反方向的转换。
int main() {
int array[4] = {0};
int (*ptr4)[4] = &array;
int (*ptrN)[] = ptr4;
int (*ptr5)[5] = ptrN; /* oh dear */
}
这显然很糟糕。 C++ 已经删除了这条规则,说 int[4]
和 int[]
是兼容类型的规则,并且几乎摆脱了兼容类型的概念。
一些安全的特定转换are being considered for inclusion in a future version of C++。它们也包括您的转化。