问题
在db.h中定义了如下枚举类型:
typedef enum {
DB_BTREE=1,
DB_HASH=2,
DB_RECNO=3,
DB_QUEUE=4,
DB_UNKNOWN=5 /* Figure it out on open. */
} DBTYPE;
在VS2005的MFC程序使用BerkeleyDB,编译器报告下面的错误,我想很多人会被弄得一头雾水:
db.h(1318) : error C2143: syntax error : missing '}' before '('
其实导致这个错误的原因:../Microsoft Visual Studio 8/VC/atlmfc/include/ocdb.h定义了宏
#define DB_UNKNOWN (DWORD)0xFFFFFFFA
将每个#include <db.h>改为如下形式:
#ifdef DB_UNKNOWN
#undef DB_UNKNOWN
#endif
#include <db.h>
编译器又会报告:
db.h(1319) : error C2371: 'DBTYPE' : redefinition; different basic types
../microsoft visual studio 8/vc/platformsdk/include/oledb.h(833) : see declaration of 'DBTYPE'
原来导致这些编译错误的原因是BerkeleyDB与VS2005自带库文件类型名字冲突导致的。网上看到很多人遇到这个问题,然而真正解决的却不多。好在知道了结症,总比一头雾水的好。
解决
有人建议通过更改系统文件(oledb.h和ocdb.h)
在系统的相应类型定义出加上
#ifdef XXX
#endif
的预编译宏来决定系统文件是否定义相应的类型,只要在你的工程StdAfx.h中加入这个XXX宏定义就可以而不影响其他工程的编译。
或者象我一样注视掉StdAfx.h中的如下文件包含:
#include <afxdisp.h> // MFC Automation classes
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
当然这也不是最终的解决方案。
如果你有更好的方案请告诉我。
小结
无论怎样我们都知道如下几点:
1) error C2143:枚举成员为宏定义的数值量是很容易被忽视的错误,编译器报错没有多大的帮助,如下所示代码将会导致这个错误:
#define _DB_UNKNOWN (DWORD)0xFFFFFFFA
typedef enum {
_DB_BTREE=1,
_DB_HASH=2,
_DB_RECNO=3,
_DB_QUEUE=4,
_DB_UNKNOWN=5 /* Figure it out on open. */
} DBTYPE;
2)知道了名字空间的冲突是需要注意的事情。
3)对于库开发者怎样灵活装配功能模块的重要性,当然对于微软的库我想可能没能找到灵活配置模块的方式。当然不仅是库,程序的一般模块也可能会遇到同样的问题。
在db.h中定义了如下枚举类型:
typedef enum {
DB_BTREE=1,
DB_HASH=2,
DB_RECNO=3,
DB_QUEUE=4,
DB_UNKNOWN=5 /* Figure it out on open. */
} DBTYPE;
在VS2005的MFC程序使用BerkeleyDB,编译器报告下面的错误,我想很多人会被弄得一头雾水:
db.h(1318) : error C2143: syntax error : missing '}' before '('
其实导致这个错误的原因:../Microsoft Visual Studio 8/VC/atlmfc/include/ocdb.h定义了宏
#define DB_UNKNOWN (DWORD)0xFFFFFFFA
将每个#include <db.h>改为如下形式:
#ifdef DB_UNKNOWN
#undef DB_UNKNOWN
#endif
#include <db.h>
编译器又会报告:
db.h(1319) : error C2371: 'DBTYPE' : redefinition; different basic types
../microsoft visual studio 8/vc/platformsdk/include/oledb.h(833) : see declaration of 'DBTYPE'
原来导致这些编译错误的原因是BerkeleyDB与VS2005自带库文件类型名字冲突导致的。网上看到很多人遇到这个问题,然而真正解决的却不多。好在知道了结症,总比一头雾水的好。
解决
有人建议通过更改系统文件(oledb.h和ocdb.h)
在系统的相应类型定义出加上
#ifdef XXX
#endif
的预编译宏来决定系统文件是否定义相应的类型,只要在你的工程StdAfx.h中加入这个XXX宏定义就可以而不影响其他工程的编译。
或者象我一样注视掉StdAfx.h中的如下文件包含:
#include <afxdisp.h> // MFC Automation classes
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
当然这也不是最终的解决方案。
如果你有更好的方案请告诉我。
小结
无论怎样我们都知道如下几点:
1) error C2143:枚举成员为宏定义的数值量是很容易被忽视的错误,编译器报错没有多大的帮助,如下所示代码将会导致这个错误:
#define _DB_UNKNOWN (DWORD)0xFFFFFFFA
typedef enum {
_DB_BTREE=1,
_DB_HASH=2,
_DB_RECNO=3,
_DB_QUEUE=4,
_DB_UNKNOWN=5 /* Figure it out on open. */
} DBTYPE;
2)知道了名字空间的冲突是需要注意的事情。
3)对于库开发者怎样灵活装配功能模块的重要性,当然对于微软的库我想可能没能找到灵活配置模块的方式。当然不仅是库,程序的一般模块也可能会遇到同样的问题。