gpt4 book ai didi

c - 赋值 <指向常量数组的指针> = <指向数组的指针> : incompatible pointers

转载 作者:太空狗 更新时间:2023-10-29 16:53:59 26 4
gpt4 key购买 nike

当我编译这样的东西时

double da[ 3 ] = { 2., 3., 4. };
double (* pda)[ 3 ] = &da;
double const (* cpda)[ 3 ] = pda; // gcc: warning; MSVC: ok

gcc 警告我

warning: initialization from incompatible pointer type [enabled by default]

问题:这个作业有什么问题?是的,从技术上讲,它们是不同的类型,但我在这里没有看到任何危险,double const (*)[ 3 ] 对我来说看起来比 double (*)[ 3 ] 更安全

我做了一些测试,结果让我更加困惑:

1) MSVC 对 double const (* cpda)[ 3 ] = pda; 赋值非常满意,没有错误,没有警告。

2) gcc 和 MSVC 都对此感到满意

double d = 1.;
double * pd = &d;
double const * cpd = pd; // gcc: ok; MSVC: ok

虽然这些也是不同的类型。

3) 在这个例子中

double d = 1.;
double * pd = &d;
double * * ppd = &pd;
double const * * cppd = ppd; // gcc: warning; MSVC: error

gcc 给出相同的警告,但 MSVC 给出错误(!)。

谁在这里? gcc 还是 MSVC?


测试结果。

编译器:

1) gcc 版本 4.7.2:http://www.compileonline.com/compile_c_online.php

2) 适用于 x86 的 MSVC(作为 C++ 代码)版本“VS2012CTP”17.00.51025:http://rise4fun.com/vcpp

3) MSVC(作为 C 代码)VS2010:离线测试

int main()
{
double d = 1.;

double * pd = &d;
double const * cpd = pd;
// gcc: ok
// MSVC C++: ok
// MSVC C: ok

double * * ppd = &pd;
double const * * cppd = ppd;
// gcc: warning: initialization from incompatible pointer type [enabled by default]
// MSVC C++: error C2440: 'initializing' : cannot convert from 'double **' to 'const double **'
// MSVC C: ok

double da[ 3 ] = { 2., 3., 4. };

double (* pda)[ 3 ] = &da;
double const (* cpda)[ 3 ] = pda;
// gcc: warning: initialization from incompatible pointer type [enabled by default]
// MSVC C++: ok
// MSVC C: ok

cpd, cpda;
return 0;
}

编辑:

我只是在我的 Visual Studio 上将它编译为 C 代码(不是 C++),它没有给出任何错误,也没有任何警告。我编辑了上面代码的注释

最佳答案

这是对标准的解释不同,gcc 认为类型不兼容,而 MSVC 和 clang 认为。

6.7.6.1 (2):

For two pointer types to be compatible, both shall be identically qualified and both shall be pointers to compatible types.

pdacpda 的类型是相同限定的[完全没有限定],所以问题是它们是否指向兼容的类型,即 double [3]const double[3] 兼容类型?

6.7.6.2 (6):

For two array types to be compatible, both shall have compatible element types, and if both size specifiers are present, and are integer constant expressions, then both size specifiers shall have the same constant value. If the two array types are used in a context which requires them to be compatible, it is undefined behavior if the two size specifiers evaluate to unequal values.

所以问题是 doubleconst double 是否兼容类型。

6.7.3 (10):

For two qualified types to be compatible, both shall have the identically qualified version of a compatible type; the order of type qualifiers within a list of specifiers or qualifiers does not affect the specified type.

我会说这使得 doubleconst double 不兼容,所以 gcc 是正确的。

初始化

double const * cpd = pd;

没问题,因为 6.5.16.1 列表中的赋值约束(与初始化相关)

the left operand has atomic, qualified, or unqualified pointer type, and (considering the type the left operand would have after lvalue conversion) both operands are pointers to qualified or unqualified versions of compatible types, and the type pointed to by the left has all the qualifiers of the type pointed to by the right;

作为可接受的情况之一。 cpdpd 都指向 double 的限定版本,左操作数的目标具有右操作数的所有限定符(还有一个,const).

但是,类型double*const double* 不兼容,因此

double const * * cppd = ppd;

再次无效,需要诊断消息。

关于c - 赋值 <指向常量数组的指针> = <指向数组的指针> : incompatible pointers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17122727/

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