2011-08-24 92 views
0

我在Visual Studio 2010中編譯和舊的C++ Visual Studio 5項目時出現了一個奇怪的問題。我看不到一個嘮叨的編譯器錯誤,與枚舉「DBTYPE」相關。 .h文件的SNIPPIT下面給出了一些額外的行櫃面的錯誤是從上面來:嘗試在C++ Visual Studio 2010中聲明枚舉時出現奇怪的錯誤

struct CBrowseField; 
class CODBCBrowseDlg; 

typedef CArray <CBrowseField*, CBrowseField*&> FLDNAMES; 
typedef CArray <CString, LPCTSTR > COLNAMES; 

enum DBTYPE 
{     //this bracket is where all 7 errors point to. 
    DB_FOXPRO26, 
    DB_OTHERS 
}; 

我拿到7個錯誤,當我編譯,都說同樣的事情,都指向同一行數。錯誤如下:

錯誤71錯誤C2371:'DBTYPE':redefinition;不同的基本類型d:\ temp \ npc \ print manager - 1 \ core \ blib \ odbcbrowsegrid.h 29 1 npcnt

那麼這裏到底發生了什麼。我檢查並重新檢查了語法。我看起來很好。我已經搜索了整個目錄,看看是否有另一個DBTYPE實例,但沒有。我錯過了什麼?如果它真的被重新定義,爲什麼它不告訴我其他定義在哪裏?

+0

如果將DBTYPE更改爲其他內容,還會出現錯誤嗎? (如DB_TYPE) – Ferruccio

+0

當我更改名稱時,錯誤消失。我不特別綁定DBTYPE這個名字,所以我對改變它沒有任何保留。 – Ultratrunks

回答

0

你在某處使用OleDb嗎? (或者包含頭文件的東西)它定義了一個DBTYPE類型(在oledb.h中)。這可能會導致衝突。

+0

看來我沒有包括OleDb,但我改變了從DBTYPE到DB_TYPE的枚舉名稱,正如前面的評論者所述,並且錯誤消失了。包含內容的項目必須存在衝突。 – Ultratrunks

2

看起來像你,包括可能間接地odbcbrowsegrid.h文件,它恰好包含具有相同名稱的東西,我會在下注29

所以你只需要調用你的枚舉不同。

後來:除非...你的文件實際上是odbcbrowsegrid.h。然後我說了一句廢話。

+0

文件上已經有一個包含守護程序。 – Ultratrunks

+0

包含警衛並不意味着您可以簡單地重新聲明公共標識符。這隻意味着很可能你不會用同樣的.h文件來完成它。

0

要獲取特定的錯誤,你需要做的是這樣的:

typedef int DBTYPE; 
enum DBTYPE {DB_FOXPRO26, DB_OTHERS}; 

(定義爲DBTYPE枚舉兩次給出了不同的錯誤)。這意味着雖然包含守衛(#define ODBCBROWSERGRID_H等)是一個好主意,但他們不會解決這個問題。

基本上,您正在使用包含文件,該文件使用名稱DBTYPE用於其他目的。你可以追蹤包含文件,確定你是否真的需要其他文件,然後,如果沒有,找出如何避免加載它 - 或者你可以給你的DBTYPE一個不同的名字。 (推薦)

相關問題