int 指针类型为 int

Int pointer type to int

我很难解决 VS2013 发出的一个警告。 我有一段代码用于将文本传递给 int var:

#define WRITE(txt)  { foo->bar.func = func_xyz; foo->bar.xyz.var = (((uint64_t) (uintptr_t) (txt)) & 0xFFFFFFFFu); } //where var is uint32_t

这导致编译器 return

warning C4244: '=' : conversion from 'uintptr_t' to 'uint32_t', possible loss of data.

不幸的是,现在我无法将 var 类型更改为 uint32_t 以外的任何类型,不幸的是我成为了预处理器指令的受害者

#ifdef  _WIN64
    typedef unsigned __int64    uintptr_t;

有什么方法可以绕过这个警告并以正确的方式去做吗?我 100% 确定这是完全有效的(仅仅是因为它是),但任何类型的警告都是不可接受的。

再投一个演员就可以了:

#define WRITE(txt) {                                                             \
    foo->bar.func = func_xyz;                                                    \
    foo->bar.xyz.var = (uint32_t)(((uint64_t) (uintptr_t) (txt)) & 0xFFFFFFFFu); \
} //where var is uint32_t

Is there any way to get around this warning and do it the right way?

如果txt可以是一个指针,并且你打算以一种可以从中恢复指针的形式捕获它的值,那么不,你这样做本质上是错误的,编译器警告您的代码中存在 善意 缺陷。

类型uintptr_t是一个无符号整数类型,其宽度足以容纳任何转换为​​整数的指针的值。在 win64 中,指针可以比 32 位更宽,所以 uintptr_t 也必须更宽。 (而且你不是那个类型的 "victim" —— 标准指定该类型具有这些特征。)没有可以使任意 64 位值适合 32 位的巫术。

I'm 100% sure that this is fully working (simply because it is), but any kind of warning is unacceptable.

它可能在您的所有测试中、在您的特定测试硬件上、在您的特定测试场景中,甚至在生产中都有效。这并不意味着它是正确的,或者它可以在其他硬件或其他输入下可靠地工作。