【发布时间】:2021-09-25 08:01:01
【问题描述】:
我看到一个问题What does (int*) &var mean? 有这样的代码
char i;
int* p = (int*) &i;
当我试图从here这部分了解时
#define vertexmark(vx) ((int *) (vx))[m->vertexmarkindex]
#define setvertexmark(vx, value) ((int *) (vx))[m->vertexmarkindex] = value
看起来很相似,但第二段代码仍然让我感到困惑。有人可以解释一下这是怎么回事吗?
我也对现代 C++11 感到好奇,这种 C 风格的转换应该用 reinterpret_cast 代替吗?
【问题讨论】:
-
是的,你应该改用
reinterpret_cast<>,如果只是因为它可以防止你不小心把常量扔掉。 -
您正在检查的代码来自一个旨在模拟生物功能的存储库。编写代码的目的是支持多尺度、高要求的计算。因此,它采用了专注于充分利用可执行文件的技术,而可读性和可移植性则不那么重要。本质上,它就像标准库实现的代码。由于其他合法问题,建议您最好避免在通用软件中使用大量宏和黑客攻击。但这不是“糟糕的做法”或“糟糕的代码”,都是有目的的。
-
请参阅C-style cast,了解 C++ 对
( new_type ) expression的作用。reinterpret_cast是可能的结果之一。 -
一般来说,C 风格的演员表比
reinterpret_cast做的多一点——这就解释了为什么reinterpret_cast比 C 风格演员表更受欢迎(在需要时)(在某些情况下它更安全)情况下,并且在等效的情况下,无论如何都被认为是更好的做法)。在您的第一个示例中,int *p = (int *)&i完全等同于int *p = reinterpret_cast<int *>(&i)。使用宏,C 风格转换和reinterpret_cast之间可能存在差异,具体取决于m->vertexmarkindex具有的类型(包括const限定等)。