在 C++20 中使用 bit_cast 将整数转换为 GLvoid* 是不是有效?

Posted

技术标签:

【中文标题】在 C++20 中使用 bit_cast 将整数转换为 GLvoid* 是不是有效?【英文标题】:Is it valid to cast integer to GLvoid* in C++20 using bit_cast?在 C++20 中使用 bit_cast 将整数转换为 GLvoid* 是否有效? 【发布时间】:2019-08-20 17:59:59 【问题描述】:

previous question 询问如何在 C++11 中的整数类型和 GLvoid* 之间进行转换(基于该问题的标签),但这里我对 C++20 感兴趣。

现在有std::bit_cast 作为进行类型转换的选项,我想知道将整数与OpenGL 函数一起使用是否是“正确”的方式,因为历史原因需要GLvoid* 来表示一个字节偏移量(例如glDrawRangeElements),或者是否应该使用上一个问题中引用的方法。

【问题讨论】:

【参考方案1】:

bit_cast 在这里绝对是错误的。 void* 不需要与大多数整数类型的大小相同。 bit_cast 要求源类型和目标类型具有完全相同的大小。因此,在 32 位系统上,std::bit_cast<void*>(24ull) 是编译错误。在 64 位系统上,简单的 std::bit_cast<void*>(24) 是编译错误。

甚至uintptr_t 也不需要与指针具有相同的大小;只是它的位数至少与指针一样多。如果它有更多,那么bit_cast 会窒息它。

如果您不想使用 C 样式转换,只需执行 reinterpret_cast<void*>

【讨论】:

【参考方案2】:

不,尽管(使用适当大小的整数)它在实践中通常会起作用,而且这些都不是严格符合的。这是一个 C API,所以它表示 (void*)offset(在 C 中)。如果您的工具链具有预期的 C 兼容性),您可以用 C++ 编写它,在这种情况下,它等同于 reinterpret_cast<void*>(offset),但不一定等同于 bit_cast<void*>(offset)(即使 reinterpret_cast 没有,它也会保留位模式,另外要求sizeof offset==sizeof(void*))。

【讨论】:

以上是关于在 C++20 中使用 bit_cast 将整数转换为 GLvoid* 是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 数组转数字

C 数字转 字符串

C语言,将一个整数转化为字符串再与另一字符串连接。(用指针)

c语言编一函数将一十进制整数转换为十六进制整数,谢谢

c语言中如何将字符串转化成整数型并输出?

c语言中如何将字符串转化成整数型并输出?