初始化SQL DBPROP结构时出现未对齐警告
unalignment warning when initializing SQL DBPROP structure
我有一个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
因此,似乎有人意识到了类似的问题,但没有更改包装,可能是为了避免破坏现有代码。我看不到你的代码的其余部分,但你可以尝试以下其中一种:
VARIANT tmp; ::VariantInit(&tmp); prop.vValue = tmp;
prop.vValue.vt = VT_EMPTY;
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 是否值得对齐变量?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 对齐和对齐的实际用例C++关键字
- 如何减少代码的运行时间以对齐文本?
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- 警告#13212:引用需要堆栈对齐功能的EBX
- 警告:从 'char *' 到 'float *' 的强制转换将所需的对齐从 1 增加到 4 [-Wcast-align]
- 警告 C4121 行为和结构对齐 (Visual Studio 2010)
- 为什么我得到一个未对齐指针的警告,而不是一个引用
- 初始化SQL DBPROP结构时出现未对齐警告