このようなものをコンパイルすると
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 (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++ ではない) としてコンパイルしたところ、エラーも警告もまったく表示されません。上記のコードの解説を編集しました