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用于x86: 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++),没有任何错误和警告。我已经编辑了上面的注释。
const
关键字的一些问题。它解释了当一个指针指向一个非常量变量时,为什么const
限定符不能被强制转换掉。该文还介绍了一些典型的错误用法以及如何正确地使用const
来避免这些错误。 - n. m.