当 x 无效时,这个铸造 (long*)x 是什么**

what is this casting (long*)x when x is void**

提问人:Coffee 提问时间:4/24/2023 最后编辑:Andy PrestonCoffee 更新时间:4/24/2023 访问量:28

问:

所以我在一个程序中找到了以下代码:

static void* InterlockedExchangePtr(void** x, void* switchval)
{
    return _InterlockedExchange((long*)(x), (long)(switchval));
}

(我知道原子学,我唯一不太明白的是这个类型是什么(long*)(x))

C 转换 针到指针

评论


答:

0赞 guard3 4/24/2023 #1

这会将 ,(指向 void 指针的指针)转换为指向 的指针。xlong

该强制转换是必要的,因为期望 a 作为其第一个参数,并且不能隐式转换为该参数。_InterlockedExchangelong*void**

https://learn.microsoft.com/en-us/cpp/intrinsics/interlockedexchange-intrinsic-functions

评论

1赞 Lundin 4/24/2023
严格来说,a 不一定能够容纳 a 的表示,不像 a 是一种特殊的指针类型。此外,转换为是有问题的,因为这可能会导致信息丢失,以防指针和大小不同。所以这充其量是可疑的代码,我认为问题是为什么以这种可疑的方式完成?void**long*void*void*longlong
0赞 Coffee 4/26/2023
@guard3 其实是的,你说得很对,伦丁!我不明白为什么有人会将 void** 转换为 long*(而不是这样做类型转换:void** 到 long** 或 void* 到 long*)。老实说,我什至不知道你可以这样做,直到现在才出现错误
0赞 guard3 4/26/2023
@Coffee目的是将指向的指针转换为整数,因为就程序集而言,指针是整数。如果可以对整数进行原子运算,那么它们也可以使用指针进行原子运算。这之所以有效,是因为至少在 32 位窗口和 msvc 中,a 和指针都是 32 位。但是该函数应该由 winapi 在内部使用,不应以其他方式使用,因此该示例是不好的做法。long