【发布时间】:2013-06-15 10:40:54
【问题描述】:
当我编译这样的东西时
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) MSVC(作为 C++ 代码)版本 'VS2012CTP' 17.00.51025 for x86:http://rise4fun.com/vcpp
3) MSVC (as C code) 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++),它没有给出任何错误,也没有任何警告。我编辑了上述代码的注释
【问题讨论】:
-
@n.m.谢谢,我现在明白为什么它很危险
标签: c pointers constants compiler-warnings gcc-warning