如何抑制“警告:从不同大小的整数强制转换为指针”?

时间:2019-03-22 16:48:10

标签: c casting suppress-warnings

TL; DR:

我需要在代码中执行以下操作(大大简化了示例):

int ret = 42;
void * marshaled_ret = (void *) ret;
int unmarshaled_ret = (int) marshaled_ret;

这会导致编译器警告:

  

警告:从不同大小的整数强制转换为指针[-Wint-to-pointer-cast]

如何针对这种特殊情况禁止编译器警告?


背景:我正在围绕平台特定的多线程库编写一个抽象层。

一项重大挑战是,库期望线程的主要功能具有不同的签名。 POSIX具有

(void *)(*thread_main)(void *)

Windows(有效)拥有

int (*thread_main)(void *)

即只有返回类型不同。

由于我需要在所有平台上使用一个函数签名,因此我选择了int作为最受约束的返回类型。创建线程时,我将用户提供的函数及其参数编组到struct中,并调用包装函数(具有平台期望的签名),然后调用实际的main函数。

但是,在POSIX上,这涉及将int强制转换为void *并返回,如前所示,这将导致编译器警告。

很明显,如果将int用作指针,则将其用作指针是个坏主意(几乎可以保证段故障)。但是,在这种情况下,指针类型只是我的“整数m子”,决不打算用作指针。

如何针对这种特殊情况禁止编译器警告?

1 个答案:

答案 0 :(得分:0)

进行两次转换(int-> void*void*-> int)时,请先转换为uintptr_t,然后转换为所需的类型:

int ret = 42;
void *marshaled_return = (void *)(uintptr_t)ret;
int unmarshaled_return = (int)(uintptr_t)marshaled_return;