3

私はコードの一部を持っています

    typedef unsigned char   _uint8;
    typedef unsigned short  _uint16;
    typedef unsigned int    _uint32;
    typedef float           _float32;

    typedef char            _int8;
    typedef short           _int16;
    typedef int             _int32;

最後の 3 行にある行でエラーが発生しています

エラーメッセージは

エラー C2632: 'char' の後に 'char' が続くのは不正です
エラー C2632: 'short' の後に 'short' が続くのは不正です

エラー C2632: 'int' に続く 'int' は無効です

4

2 に答える 2

2

typedefこれらのタイプは、コードがそれを試みる前に、 (おそらく) または#define(より可能性が高い)によって既に作成されています。プリプロセッサの出力を確認すると (Visual-C++ で可能な場合)、その理由を突き止めるのに役立つ場合があります。

于 2013-08-26T17:12:22.557 に答える
2

C および C++ では、アンダースコアで始まる独自の識別子を定義することは違法です (未定義の動作を引き起こします)。アンダースコアで始まる名前を使用できるのは、コンパイラと標準ライブラリだけです。これらの特定の名前 (_int8など) は、マクロまたは組み込み型として既に定義されているようです。

別の名前を選択する必要があります。

引用

n1570 §7.1.3 から、

アンダースコアで始まるすべての識別子は、通常の名前空間とタグ名空間の両方で、ファイル スコープの識別子として使用するために常に予約されています。

...

プログラムが予約されているコンテキストで識別子を宣言または定義する場合 (7.1.4 で許可されている場合を除く)、または予約された識別子をマクロ名として定義する場合、動作は未定義です。

したがって、 type を定義しようとすると_int8、プログラムは未定義の動作を呼び出します。「未定義の動作」は専門用語であり、コンパイラが保証しないことを意味します。エラー メッセージが表示されるか、期待どおりに動作するか、まったく別のことが発生する可能性があります。エラー メッセージは表示されないかもしれませんが、プログラムは正しく動作しません。

次のコードを Visual Studio でコンパイルしてみてください...

int main()
{
    _int8 x = 1;
    return 0;
}

コンパイルします...つまり_int8、型を定義するためにコンパイラによって既に使用されています。MSDN の検索では何も見つからないため、文書化されていないタイプのようです。ただし、とにかく独自のものを定義することは許可されていませ_int8ん。

于 2013-08-26T17:13:07.330 に答える