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

问题描述 投票:1回答:1

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转换为指针是一个坏主意。但是,在这种情况下,指针类型只是我的“整数骡子”,从不打算用作指针。

如何针对此特定事件抑制编译器警告?

c casting suppress-warnings
1个回答
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;
© www.soinside.com 2019 - 2024. All rights reserved.