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

时间:2011-05-27 14:33:35

标签: c++ sql arm

我有一个使用Microsoft SQLCE 3.5的Windows Mobile 6 ARMV4I的Visual Studio 2008 C ++项目。当我初始化VARIANT结构的DBPROP组件(如下所示)时,我收到编译器警告消息: 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

1 个答案:

答案 0 :(得分:0)

如果您计划将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;