初始化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;