我有一个使用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
答案 0 :(得分:0)
如果您计划将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;