初始化SQL DBPROP结构时出现未对齐警告

unalignment warning when initializing SQL DBPROP structure

本文关键字:对齐 警告 SQL DBPROP 结构 初始化      更新时间:2023-10-16

我有一个Visual Studio 2008 C++项目,用于使用Microsoft SQLCE 3.5的Windows Mobile 6 ARMV4I。当我初始化DBPROP结构的VARIANT组件时(如下所示),我会得到一条编译器警告消息:C4366:一元"&"的结果运算符可能未对齐

#include <sqlce_oledb.h>
DBPROP prop = { 0 };
::VariantInit( &prop.vValue ); // warning here

我可以将__unaligned强制转换添加到该行,但因为VariantInit不接受__unaligned,所以我得到了另一个C4090警告。

我注意到*sqlce_oledb.h*中的DBPROP定义包括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处理器)?或者,我应该只是沉默警告而忽略它吗?或者,还有什么我应该做的吗?

谢谢,PaulH

如果您计划将DBPROP结构传递给其他API,请不要更改其对齐方式,因为这可能会更改包装,它将停止工作。我注意到标题中有以下注释:

#if 0 
//DBPROPINFO is an unaligned structure. MIDL workaround. 42212352
typedef DBPROPINFO  *PDBPROPINFO;
#else
typedef DBPROPINFO UNALIGNED  * PDBPROPINFO;      //????????????
#endif

因此,似乎有人意识到了类似的问题,但没有更改包装,可能是为了避免破坏现有代码。我看不到你的代码的其余部分,但你可以尝试以下其中一种:

  1. VARIANT tmp; ::VariantInit(&tmp); prop.vValue = tmp;

  2. prop.vValue.vt = VT_EMPTY;