1

TL;博士:

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

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了最受限制的返回类型。创建线程时,我将用户提供的函数及其参数编组为 astruct并调用包装函数(具有平台预期的签名),然后调用实际的 main 函数。

但是,在 POSIX 上,这涉及到强制转换intvoid *如上所示,这会导致编译器警告。

显然,int如果您将它用作指针(几乎可以保证段错误),那么以这种方式将指针转换为指针是一个坏主意。然而,在这种情况下,指针类型只是我的“整数骡子”,从不打算用作指针。

对于这种特殊情况,如何抑制编译器警告?

4

1 回答 1

1

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

int ret = 42;
void *marshaled_return = (void *)(uintptr_t)ret;
int unmarshaled_return = (int)(uintptr_t)marshaled_return;
于 2019-03-22T16:54:10.090 回答