2011-05-27 45 views
0

我有一個使用Microsoft SQLCE 3.5的Windows Mobile 6 ARMV4I的Visual Studio 2008 C++項目。當我初始化DBPROP結構的VARIANT組件(如下)時,我收到編譯器警告消息:C4366:一元'&'運算符的結果可能未對齊當初始化SQL DBPROP結構時出現不對齊警告

#include <sqlce_oledb.h> 

DBPROP prop = { 0 }; 
::VariantInit(&prop.vValue); // warning here 

我可以添加__unaligned投射到線,但因爲VariantInit不採取__unaligned,我得到另一個C4090警告。

我注意到DBPROP定義* sqlce_oledb.h *包括對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

如果您計劃在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;

+0

我都喜歡的建議1和2。謝謝。 – PaulH 2011-05-27 18:11:13