我有一个适用于x86的现有C代码库。
我现在正在为x64编译它。
我想做的是将size_t强制转换为DWORD,如果数据丢失则抛出异常。
问:这有成语吗?
这就是我这样做的原因:
一堆Windows API接受DWORD作为参数,代码当前假设sizeof(DWORD)== sizeof(size_t)。这个假设适用于x86,但不适用于x64。因此,在编译x64时,传递size_t代替DWORD参数,会生成编译时警告。
在几乎所有这些情况下,实际尺寸不会超过2 ^ 32。但我想以防御性和明确的方式对其进行编码。
这是我的第一个x64项目,所以......要温柔。
答案 0 :(得分:1)
请参阅boost :: numeric_cast
http://www.boost.org/doc/libs/1_33_1/libs/numeric/conversion/doc/numeric_cast.html
答案 1 :(得分:0)
我刚刚定义了一个执行强制转换的函数。
我包含了类似于断言的行为,以确保我不会默默地抛弃指针。
DWORD ConvertSizeTo32bits(size_t sz, char *file, int line)
{
if (!(0 <= sz && sz <= INT32_MAX)) {
EmitLogMessage("Invalid Pointer size: %d file(%s) line(%d)",
sz, file, line);
ExitProcess( 0 );
}
return (DWORD) sz;
}
答案 2 :(得分:0)
#define size_t_to_DWORD(st,dw) if ((DWORD)(st) != st) RaiseException(exLossOfData, 0, 0, NULL); else dw = (DWORD)(st)
size_t st;
DWORD dw;
st = 0xffffffff;
size_t_to_DWORD(st,dw); // this succeeds
st = 0xffffffff1;
size_t_to_DWORD(st,dw); // this throws
编辑:
或者更好的是,这样做可以在表达式中使用它:
DWORD MyRaiseException()
{
RaiseException(1, 0, 0, NULL);
return 0;
}
#define size_t_to_DWORD(st) (DWORD)(st) != (st) ? MyRaiseException() : (DWORD)(st)
void main(void)
{
size_t st;
DWORD dw;
st = 0xffffffff1;
dw = size_t_to_DWORD(st);
printf("%u %u\n", st, dw);
}