「次のコードのコンパイルがエラー C2371 行 04 で失敗するのはなぜですか」という質問がありますか?
VS6 では成功しましたが、VS2008 では失敗しました。
05行目をコメントアウトしようとしましたが、まだこのコンパイルエラーがあります。
01 typedef struct tagAAA
02 {
03 unsigned char a;
04 } AAA;
05 typedef AAA FAR* LPAAA;
前もって感謝します。
「次のコードのコンパイルがエラー C2371 行 04 で失敗するのはなぜですか」という質問がありますか?
VS6 では成功しましたが、VS2008 では失敗しました。
05行目をコメントアウトしようとしましたが、まだこのコンパイルエラーがあります。
01 typedef struct tagAAA
02 {
03 unsigned char a;
04 } AAA;
05 typedef AAA FAR* LPAAA;
前もって感謝します。
おそらく、コンパイラはエラーメッセージとコードを出し、問題が何であるかを教えてくれました。コードをグーグルで検索すると、次のことがわかります。
'identifier' : redefinition; different basic types
エラーは4行目にあるとあなたは言います。その場合、おそらく識別子はAAAであり、あなたはすでに。と呼ばれる他の何かを宣言していますAAA。
15年前の先行標準コンパイラで成功する理由については、歴史家に尋ねる必要があります。
typedef structまた、そのナンセンスを取り除きます。これはCでは悪い考えであり、C++ではまったく意味がありません。FAR*また、16ビットMS-DOSをサポートする必要がない限り、そのナンセンスも取り除きます。あなたはただ必要です
struct AAA {
unsigned char a;
};
申し訳ありませんが、Windows で既に定義されているものと同じ名前の競合を使用していました。VS6.0にはそのファイルが含まれていなかったようです。
平素は格別のお引き立てを賜り、誠にありがとうございます。
もう 1 つのオプションは、stdafx.h に次のマクロを含めることです。
の定義は表示されませんFAR(ここではマクロのみになります)。8086(16ビットMS / DOS)の時代には、Microsoftのヘッダーにそのようなマクロがあったと思います。推測しているだけですが、古いコードを壊さないようにしばらくの間それを保持し、VC6の後でのみそれを取り除いたとしても、私は驚かないでしょう。
MSDN によると、エラーは「識別子は既に宣言されています」です。
これは、識別子AAAが既に宣言されていることを意味します。
それが理由です。
C++ では、単純に次のように記述します。
struct Aaa
{
unsigned char a;
};
どこ
タグなし (C++ では不要)
constポインター型の typedef がない ( Microsoft 独自のコードなどで、正しく適用する際に問題を引き起こす忌まわしい行為です)。
いいえFAR(MS-DOS は少し古いです)。
また、すべて大文字ではない名前を使用して、マクロ名と競合する可能性を最小限に抑えます。
このような競合が問題に関係している可能性があります。