9

このようなものをコンパイルすると

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

4

3 に答える 3