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一个不同的名字。 (推荐)

相关问题