问题描述
|
我有一个使用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;