gpt4 book ai didi

c++ - 有没有办法避免严格的别名警告?

转载 作者:太空狗 更新时间:2023-10-29 20:58:33 25 4
gpt4 key购买 nike

我正在使用一个使用回调的库 (ENet)。在这些回调函数中,它传递一个包含用户数据的 void* 的结构,供您自己使用。我想使用那个变量,但不是作为指针。我不想分配内存只是为了指向它,我宁愿直接使用 void* 的空间来存储一个 size_t。

但是,正如预期的那样,当我将 void* 变量转换为 size_t 变量时,我收到了严格的别名警告。并且回调的结构不提供一个 union 来访问它作为 void* 以外的东西。

我知道我可以完全禁用该警告,但对于这种特殊情况,我宁愿将其静音。有没有一种方法可以编写这种类型的强制转换,让编译器知道它是有意的,以避免警告?

编辑:

这是我正在尝试做的一个例子。由于我需要能够编辑用户值,因此我将其转换为 size_t,同时还尝试获取对它的引用:

size_t& offset = reinterpret_cast<size_t&>(packet->userData);

这有效,但会发出警告。

最佳答案

But, as expected, when I dereference the void* variable to a size_t variable, I get a strict alias warning.

如果你想使用 void * 本身来传输一个普通整数,你不想取消引用它,你想把它转换成一个合适的整数类型(intptr_t 是您最好的选择,因为标准保证它可以通过 void * 进行往返。

intptr_t magic=42;
register_callback(&myfunc, (void *)magic);

// ...

void myfunc(void *context)
{
intptr_t magic=(intptr_t)context;
// ...
}

(如果你喜欢 C++ 风格的强制转换,那些都是 reinterpret_cast)

此外,您可能在代码中做了一些奇怪的事情,因为 void *(如 char *unsigned char *)不是遵守严格的别名规则(它们可以别名任何其他指针)。


更新

Here is an example of what I'm trying to do. Since I need to be able to edit the user value, I'm casting it to size_t while also trying to grab a reference to it:

size_t& offset = reinterpret_cast<size_t&>(packet->userData);

This works, but gives the warning.

不,即使假设 size_tvoid * 具有相同的大小和对齐要求(无法保证),这也无法移植;不允许将 void *&size_t & 别名(另外,这特别不正当,因为它隐藏在引用中)。

如果你真的需要这样做,你必须接受你的编译器;例如,在 gcc 中,您可以使用 -fno-strict-aliasing 只编译包含此内容的文件,而不是简单地禁用警告(=隐藏潜在问题) , 禁用编译器关于严格别名的假设,因此即使指向不相关类型的指针/引用指向相同的东西,生成的代码也能正常工作。

关于c++ - 有没有办法避免严格的别名警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27433932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com