VS2005中的MFC程序使用BerkeleyDB

来源:互联网 发布:高中物理实验软件 编辑:程序博客网 时间:2024/04/29 01:12
问题
在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)对于库开发者怎样灵活装配功能模块的重要性,当然对于微软的库我想可能没能找到灵活配置模块的方式。当然不仅是库,程序的一般模块也可能会遇到同样的问题。