2012-11-16 129 views
0

我可能有一個問題,因爲「爲什麼以下代碼編譯失敗,錯誤C2371在第04行」?由於typedef導致C2371錯誤

它在VS6上成功,但在VS2008上失敗。

我試過註釋掉第05行,仍然有這個編譯錯誤。

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

05 typedef AAA FAR* LPAAA; 

在此先感謝。

+0

因爲它以前的東西排除很少使用的東西。 –

+1

可能因爲'AAA'被定義在其他地方。作爲一個測試嘗試改變'AAA'到別的東西,看到錯誤消失。也可能有助於引用確切的錯誤消息。 – john

+3

如果您使用C++編譯此代碼,則不需要'typedef struct',因爲所有結構(如類)都可以用作類型。 –

回答

4

據推測,編譯器給出了一個錯誤消息以及一個代碼,告訴你問題是什麼。谷歌搜索代碼顯示:

'identifier' : redefinition; different basic types 

你說錯誤是在第4行;在這種情況下,推測標識符是AAA,並且您已經聲明瞭其他名爲AAA的其他內容。至於爲什麼它在一個15歲的標準前編譯器上成功,你必須問一個歷史學家。

另外,擺脫typedef struct廢話;這在C語言中是一個壞主意,在C++中完全沒有意義。除非你需要支持16位MS-DOS,否則也要去掉FAR*廢話;你只需要

struct AAA { 
    unsigned char a; 
}; 
0

您不會向我們展示FAR(它只能是一個宏)的定義。我認爲微軟的頭文件在8086(16位MS/DOS)時代出現了這樣一個宏。我只是在猜測,但如果他們保持一段時間以避免破壞舊代碼,並且在VC6之後才擺脫它,它並不會讓我感到驚訝。

0

MSDN says錯誤是「該標識符已被聲明」。

這意味着標識符AAA已經被聲明。

所以這就是原因。


在C++中,簡單地寫

struct Aaa 
{ 
    unsigned char  a; 
}; 

其中

  • 沒有標籤(未需要C++)

  • 沒有指針類型(所厭惡的類型定義,和也導致正確應用const的問題,例如在Microsoft ’ s自己的代碼),

  • no FAR(MS-DOS有點古老)。

另外,使用未全部大寫的名字,以儘量減少衝突與宏名的可能性。

這樣的衝突可能被捲入您的問題。

1

對不起,我正在使用與已經在Windows中定義的名稱相同的名稱衝突。 看來,VS6.0不包括該文件。

非常感謝您的支持。

另一種選擇是包括下面的宏在stdafx.h中

定義VC_EXTRALEAN //從Windows頭

相關問題