C++ 如何从bool向void*施放?

C++ 如何从bool向void*施放?,c++,type-conversion,C++,Type Conversion,我正在尝试使用mingw在windows上为gtkmm构建cairomm。编译在具有参数的函数调用处中断,该参数将布尔值重新解释为void* cairo_font_face_set_user_data(cobj(), &USER_DATA_KEY_DEFAULT_TEXT_TO_GLYPHS, reinterpret_cast<void*>(true), NULL); cairo\u font\u face\u set\u user\u data(cobj(),&user\

我正在尝试使用mingw在windows上为gtkmm构建cairomm。编译在具有参数的函数调用处中断,该参数将布尔值重新解释为void*

cairo_font_face_set_user_data(cobj(), &USER_DATA_KEY_DEFAULT_TEXT_TO_GLYPHS, reinterpret_cast<void*>(true), NULL);
cairo\u font\u face\u set\u user\u data(cobj(),&user\u data\u KEY\u DEFAULT\u TEXT\u TO\u GLYPHS,reinterpret\u cast(true),NULL);

这是代码中断的地方,原因是“从bool到void*的无效重新解释”。为什么会发生这种情况,我如何修改这一行来编译它?需要帮助

我看到这是用户数据,您可以控制如何处理该值,请先将布尔值转换为int:
重新解释转换(static\u cast(true))
。这样做是有意义的,因为void*参数将取代此ANSI-C库中的模板函数。您只需要一个真/假值。因此,暂时将其编码为指针应该是没有危险的,只要它有很好的文档记录。实际上,您最好这样做:
reinterpret\u cast(1)
reinterpret\u cast(+true)
它失败了,因为强制转换没有任何意义-您使用的是布尔真/假值,并要求编译器将其解释为指针,直截了当地说就是内存位置。这两个角色之间甚至没有什么联系。

重新诠释演员阵容是一个很好的例子。告诉我们更多关于您试图解决的问题,也许我们可以找到一个解决方案,而无需重新解释。为什么要将bool转换为void*?

尝试更新版本的编译器。我刚刚测试过,这个cast至少可以在GCC4.1及以上版本上运行。我不知道gcc版本到底是如何映射到mingw版本的。

根据标准,它看起来应该可以工作。第3.9.1-7节说bool是一个整数类型,第5.2.10-5节说整数类型的值可以使用reinterpret_cast显式转换为指针。您的编译器似乎不是完全标准的

你能把“真”改成1吗?在C++和C++中,整数和指针类型之间的转换是一个古老而不光彩的传统。
或者,如果您真的必须这样做,请尝试(void*)true。那就把手洗干净。

我唯一抱怨这个问题的编译器是GCC(MinGW和gcc3.4.5),我不知道为什么。标准似乎明确指出这是允许的:

3.9.1基本类型

输入bool、char、wchar\u t和 有符号和无符号整数类型是 统称为整型

5.2.10重新解释铸件:

整型或整型的值 枚举类型可以是显式的 转换为指针


上述,使用<代码> RealTytCube(StasyType Cube(true))< /> >或 RealTytCype(1)是合理的解决方案。

< P>在某些情况下,非常希望编译器在代码(如代码)RealTytCube(true)< /C>中发出警告或错误,即使这段代码显然是合法C++。例如,它有助于移植到64位平台

将64位指针强制转换为小于指针的整数类型(例如
int
bool
)通常是一个错误:您正在截断指针的值。此外,C++规范似乎不能保证您可以直接将指针转换成较小的整数类型(强调添加):

5.2.10.4。指针可以显式转换为任何足以容纳它的整数类型。映射函数由实现定义

类似地,将较小的整数类型强制转换为64位指针(如
reinterpret_cast(true)
)通常也是一个错误:编译器必须用一些东西填充指针的高位;它是零填充还是符号扩展?除非您正在为内存映射I/O访问或DMA编写低级平台特定的代码,否则您通常根本不想这样做,除非您正在做一些骇人的事情(比如在指针中填充布尔值)。但是C++规范似乎并没有对这个案例说很多,除了它是实现定义(注脚省略):

5.2.10.5。整数类型或枚举类型的值可以显式转换为指针*

将指针转换为足够大的整数(如果实现中存在任何这样的整数)并返回到相同的指针类型将具有其原始值;指针和整数之间的映射由实现定义

@monjardin建议
重新解释强制转换(静态强制转换(true))
。如果错误的根源是整数类型的大小与指针大小不匹配,那么这将适用于大多数32位平台(其中
int
void*
都是32位),但在大多数64位平台上失败(其中
int
是32位,
void*
是64位)。在这种情况下,将此表达式中的
int
替换为指针大小的整数类型,例如
uintpttr\t
DWORD\u PTR
(在Windows上)应该可以工作,因为
bool
和指针大小的整数之间的转换是允许的,指针大小的整数和指针之间的转换也是允许的

GCC的更高版本有以下内容,但:

-Wno int到指针强制转换(仅限C和Objective-C)
禁止对不同大小的整数的指针类型强制转换发出警告

-指向int cast的Wno指针(仅限C和Objective-C)
禁止从指向不同大小的整数类型的指针的强制转换发出警告


我认为他正在使用一个将用户数据存储为void*的库。他无能为力。这实际上是在库中存储标记数据的一种非常常见的方法。啊,是的,我同意。。。当我可以传递一个指向用户数据的指针(即指向bool的指针)时,我仍然避免重新解释类型转换,这将避免无意义的类型转换。(然而