如何解决初始化SQL DBPROP结构时出现未对齐警告
| 我有一个使用Microsoft SQLCE 3.5的Windows Mobile 6 ARMV4I的Visual Studio 2008 C ++项目。初始化DBPROP
结构的VARIANT
组件时(如下所示),我收到编译器警告消息:C4366:一元\'&\'运算符的结果可能未对齐。
#include <sqlce_oledb.h>
DBPROP prop = { 0 };
::VariantInit( &prop.vValue ); // warning here
我可以在行中添加__unaligned
强制类型转换,但是由于VariantInit
不需要__unaligned
,因此我收到另一个C4090警告。
我注意到* sqlce_oledb.h *中的ѭ1定义包括MIPS体系结构的打包指令:
#if defined(MIPSII_FP) || defined(MIPSIV) || defined(MIPSIV_FP)
#pragma pack(push,8)
#endif
typedef struct tagDBPROP
{
DBPROPID dwPropertyID;
DBPROPOPTIONS dwOptions;
DBPROPSTATUS dwStatus;
DBID colid;
VARIANT vValue;
} DBPROP;
#if defined(MIPSII_FP) || defined(MIPSIV) || defined(MIPSIV_FP)
#pragma pack(pop)
#endif
因此,我可以通过执行以下操作来消除警告:
#define MIPSIV
#include <sqlce_oledb.h>
#undef MIPSIV
但是,这感觉很脏。我的问题是:设计人员是否只是在打包指令中忽略了ARM(这意味着我应该做些脏话并声称自己是MIPS处理器)?或者,我应该使警告静音而忽略它吗?或者,还有其他我应该做的事情吗?
谢谢,
保罗·H
解决方法
如果您打算将DBPROP结构传递给其他API,请不要更改其对齐方式,因为这可能会改变包装,并且它将停止工作。我在标题中注意到以下评论:
#if 0
//DBPROPINFO is an unaligned structure. MIDL workaround. 42212352
typedef DBPROPINFO *PDBPROPINFO;
#else
typedef DBPROPINFO UNALIGNED * PDBPROPINFO; //????????????
#endif
因此,似乎有人意识到了类似的问题,但没有更改包装,可能是为了避免破坏现有代码。我从这里看不到其余的代码,但是您可以尝试以下操作之一:
VARIANT tmp; ::VariantInit(&tmp); prop.vValue = tmp;
prop.vValue.vt = VT_EMPTY;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。