5

次のコードに驚きました。

#include<stdio.h>
typedef int type;

int main( )
{
    type type = 10;
    printf( "%d", type );
}

これは成功し、プログラムの出力は 10 です。

しかし、以下のようにコードを少し変更すると、

#include<stdio.h>
typedef int type;

int main()
{
    type type = 10;
    float f = 10.9898;
    int x;
    x = (type) f;
    printf( "%d, %d", type, x);
}

aCC コンパイラで:

「'type' は型として使用されていますが、型として定義されていません。」

g++ コンパイラで:

「エラー: 予期される `;' f」の前に

このパターンは変数の割り当て、式の評価などに関連している可能性があるため、コンパイラが2番目のケースでパターンを認識しなかったということですか?最初のケースでは、このパターンは変数を定義している間のみ使用されます。 .

4

1 に答える 1

11

typedef変数名と同様に、識別子にもスコープがあります。後

type type = 10;

変数typeは型名を隠しtypeます。たとえば、このコード

typedef int type;
int main( )
{
    type type = 10;
    type n;   //compile error, type is not a type name
}

同じ理由でコンパイルされません。C++ では、::type型名を参照するために使用できます。

typedef int type;
int main( )
{
    type type = 10;
    ::type n;  //compile fine
}
于 2013-10-11T05:49:58.897 に答える