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)对于库开发者怎样灵活装配功能模块的重要性,当然对于微软的库我想可能没能找到灵活配置模块的方式。当然不仅是库,程序的一般模块也可能会遇到同样的问题。
在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)对于库开发者怎样灵活装配功能模块的重要性,当然对于微软的库我想可能没能找到灵活配置模块的方式。当然不仅是库,程序的一般模块也可能会遇到同样的问题。
- VS2005中的MFC程序使用BerkeleyDB
- VS2005 MFC使用
- VS2005 MFC程序打包发布
- BerkeleyDB使用感受
- linux下使用BerkeleyDB
- BerkeleyDB的使用
- VS2005---MFC应用程序向Win32DLL程序转换
- VS2005下不用向导建立MFC程序
- BerkeleyDB使用的一些心得
- BerkeleyDB java的简单使用
- 使用VS2005调试ASP程序
- 使用VS2005调试ASP程序
- 在VS6.0和VS2005中配置berkeleyDB环境
- VS2005中的ReportViewer的使用
- CxImage在 vs2005 中的使用
- 在SDK程序中使用MFC中的辅助类
- 在SDK程序中使用MFC中的辅助类库
- 怎样在SDK程序中使用MFC中的辅助类
- 数据类型之间的转换
- OSGI在J2EE架构里到底能充当什么角色?
- Bjarne Stroustrup关于C++的讲座
- 删除C盘无用文件
- ASP.NET 登录控件概述
- VS2005中的MFC程序使用BerkeleyDB
- [Python]Django Step by Step 笔记(三)
- 关于敏捷开发
- 第一次,留个纪念!
- SQL语句:rtrim及ltrim 函数
- 8086寄存器组
- SMTP服务原理详解
- 我也不知道该说什么好。
- 再见,大学!你好,工作!