0

「次のコードのコンパイルがエラー C2371 行 04 で失敗するのはなぜですか」という質問がありますか?

VS6 では成功しましたが、VS2008 では失敗しました。

05行目をコメントアウトしようとしましたが、まだこのコンパイルエラーがあります。

01   typedef struct tagAAA
02   {
03       unsigned char      a;
04   } AAA;

05   typedef AAA FAR* LPAAA;

前もって感謝します。

4

4 に答える 4

4

おそらく、コンパイラはエラーメッセージとコードを出し、問題が何であるかを教えてくれました。コードをグーグルで検索すると、次のことがわかります。

'identifier' : redefinition; different basic types

エラーは4行目にあるとあなたは言います。その場合、おそらく識別子はAAAであり、あなたはすでに。と呼ばれる他の何かを宣言していますAAA

15年前の先行標準コンパイラで成功する理由については、歴史家に尋ねる必要があります。

typedef structまた、そのナンセンスを取り除きます。これはCでは悪い考えであり、C++ではまったく意味がありません。FAR*また、16ビットMS-DOSをサポートする必要がない限り、そのナンセンスも取り除きます。あなたはただ必要です

struct AAA {
    unsigned char a;
};
于 2012-11-16T12:53:41.087 に答える
1

申し訳ありませんが、Windows で既に定義されているものと同じ名前の競合を使用していました。VS6.0にはそのファイルが含まれていなかったようです。

平素は格別のお引き立てを賜り、誠にありがとうございます。

もう 1 つのオプションは、stdafx.h に次のマクロを含めることです。

define VC_EXTRALEAN // Windows ヘッダーからめったに使用されないものを除外する

于 2012-11-16T21:42:13.453 に答える
0

の定義は表示されませんFAR(ここではマクロのみになります)。8086(16ビットMS / DOS)の時代には、Microsoftのヘッダーにそのようなマクロがあったと思います。推測しているだけですが、古いコードを壊さないようにしばらくの間それを保持し、VC6の後でのみそれを取り除いたとしても、私は驚かないでしょう。

于 2012-11-16T12:53:34.337 に答える
0

MSDN によると、エラーは「識別子は既に宣言されています」です。

これは、識別子AAAが既に宣言されていることを意味します。

それが理由です。


C++ では、単純に次のように記述します。

struct Aaa
{
    unsigned char      a;
};

どこ

  • タグなし (C++ では不要)

  • constポインター型の typedef がない ( Microsoft 独自のコードなどで、正しく適用する際に問題を引き起こす忌まわしい行為です)。

  • いいえFAR(MS-DOS は少し古いです)。

また、すべて大文字ではない名前を使用して、マクロ名と競合する可能性を最小限に抑えます。

このような競合問題に関係している可能性があります。

于 2012-11-16T12:55:11.870 に答える