我可能有一個問題,因爲「爲什麼以下代碼編譯失敗,錯誤C2371在第04行」?由於typedef導致C2371錯誤
它在VS6上成功,但在VS2008上失敗。
我試過註釋掉第05行,仍然有這個編譯錯誤。
01 typedef struct tagAAA
02 {
03 unsigned char a;
04 } AAA;
05 typedef AAA FAR* LPAAA;
在此先感謝。
我可能有一個問題,因爲「爲什麼以下代碼編譯失敗,錯誤C2371在第04行」?由於typedef導致C2371錯誤
它在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++中完全沒有意義。除非你需要支持16位MS-DOS,否則也要去掉FAR*
廢話;你只需要
struct AAA {
unsigned char a;
};
您不會向我們展示FAR
(它只能是一個宏)的定義。我認爲微軟的頭文件在8086(16位MS/DOS)時代出現了這樣一個宏。我只是在猜測,但如果他們保持一段時間以避免破壞舊代碼,並且在VC6之後才擺脫它,它並不會讓我感到驚訝。
MSDN says錯誤是「該標識符已被聲明」。
這意味着標識符AAA
已經被聲明。
所以這就是原因。
在C++中,簡單地寫
struct Aaa
{
unsigned char a;
};
其中
沒有標籤(未需要C++)
沒有指針類型(所厭惡的類型定義,和也導致正確應用const
的問題,例如在Microsoft ’ s自己的代碼),
no FAR
(MS-DOS有點古老)。
另外,使用未全部大寫的名字,以儘量減少衝突與宏名的可能性。
這樣的衝突可能被捲入您的問題。
對不起,我正在使用與已經在Windows中定義的名稱相同的名稱衝突。 看來,VS6.0不包括該文件。
非常感謝您的支持。
另一種選擇是包括下面的宏在stdafx.h中
因爲它以前的東西排除很少使用的東西。 –
可能因爲'AAA'被定義在其他地方。作爲一個測試嘗試改變'AAA'到別的東西,看到錯誤消失。也可能有助於引用確切的錯誤消息。 – john
如果您使用C++編譯此代碼,則不需要'typedef struct',因爲所有結構(如類)都可以用作類型。 –