Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;我们应该在什么时候使用双链静态转换重新解释转换_C++_Casting_Reinterpret Cast_Static Cast - Fatal编程技术网

C++ C++;我们应该在什么时候使用双链静态转换重新解释转换

C++ C++;我们应该在什么时候使用双链静态转换重新解释转换,c++,casting,reinterpret-cast,static-cast,C++,Casting,Reinterpret Cast,Static Cast,首先,这不是一个复制品 我知道,在某些情况下,我们甚至不能使用两个链式的static\u cast来实现这一点,reinterpret\u cast做了什么。但是,在任何情况下,我是否更喜欢双链的静态强制转换,而不是简单易读的重新解释强制转换,然后静态\u cast始终使用重新解释cast作为最后手段-它不进行任何检查因此,如果您可以将两个、三个或十个语句链接在一起,对操作进行某种验证,那么您就获得了一些有价值的东西。因为场景列表可能会很长,我用简单的话来说: 如果chainedstatic\u

首先,这不是一个复制品


我知道,在某些情况下,我们甚至不能使用两个链式的
static\u cast
来实现这一点,
reinterpret\u cast
做了什么。但是,在任何情况下,我是否更喜欢双链的
静态强制转换
,而不是简单易读的
重新解释强制转换
,然后
静态\u cast

始终使用重新解释cast作为最后手段-它不进行任何检查因此,如果您可以将两个、三个或十个语句链接在一起,对操作进行某种验证,那么您就获得了一些有价值的东西。

因为场景列表可能会很长,我用简单的话来说:


如果chained
static\u cast
s没有给出编译错误,您应该避免
reinterpret\u cast
reinterpret\u cast
应该是一个巨大的闪烁符号,表示这看起来很疯狂,但我知道我在做什么。不要仅仅因为懒惰而使用它


reinterpret_cast
意味着“将这些位视为…”链式静态强制转换不相同,因为它们可能根据继承晶格修改其目标

struct A {
    int x;
};

struct B {
    int y;
};

struct C : A, B {
    int z;
};

C c;
A * a = &c;

int main () {
    assert (reinterpret_cast <B *> (a) != static_cast <B *> (static_cast <C *> (a)));
}
结构A{ int x; }; 结构B{ int-y; }; 结构C:A,B{ intz; }; C C; A*A=&c; int main(){ 断言(重新解释强制转换(a)!=静态强制转换(静态强制转换(a)); } 如果您不能100%确定
a
指向
b
,请使用
dynamic\u cast
,它将搜索上述解决方案(尽管需要运行时成本)。请记住,这可能返回NULL或在失败时抛出

我试着回想一下,当我实际使用
重新解释cast
时,实际上只有两种:

  • 当一个函数正在压缩/加密任意缓冲区时,我想使用
    const char*
    遍历它
  • if(*reinterpret\u cast(4字节数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组数组

否则,如果你有一个
a*
,它实际上是一个
B*
,那么你可能想要一个联合。

I作为一个人,我宁愿看到
重新解释投射(某个其他类型的指针)
而不是
静态投射(某个其他类型的指针))
静态投射((无效*)(某个其他类型的指针))
任何时候都可以。那一连串穿过虚空*的施法只是一种鬼鬼祟祟、卑鄙的方式,以避免使用可怕的重新解释施法

许多项目禁止使用reinterpret_cast,除非获得豁免;编写代码的人需要证明使用cast的正当性。在国际海事组织,静态cast链更糟糕(更糟糕!)与reinterpret_cast相比,该链具有与reinterpret_cast相同的效果和问题,但该链不具备使用grep轻松查找的优势

附录
这样看。案例1,你使用reinterpret_cast,你通过所有的项目环来证明它的使用,项目经理同意放弃。几个月后,一个错误被追踪到你使用dynamic_cast。你有一张免出狱卡。是项目经理的屁股在排队给你那张卡


案例2,你使用了偷偷摸摸的静态强制转换链,代码在同行评审中安然无恙。几个月后,一个错误被追踪到你使用了卑鄙的技术。你的项目经理可能会因为没有抓住这些不好的东西而有点麻烦,但你的屁股在冒险。你没有出狱的机会电子卡。你不能通过Go。你直接进入失业线。

因为理论上,他们可以做一些不同的事情(尽管很难想象这种情况)。更重要的是,他们向读者发送不同的信号,并向编译器讲述不同的故事(这可能会影响优化).从逻辑上讲,我会说使用chained
static\u cast
void*
来处理字符类型的大小写(例如,转储原始内存的图像),以及其他定义良好且可移植的情况,以及当您执行真正的低级别、硬件相关工作时的
重新解释
:通过将其地址转换为
无符号int*
和位掩蔽来提取
浮点
的指数字段(或者我做错了)。我的建议:不要使用重新解释_cast@denbardadym-过去我为硬件设备编写了很多低级代码……如果不使用
重新解释cast
,我就无法做到这一点。我知道你的意思,在大多数情况下(低级除外)案例可能是真的,但不是一般的。为什么隐式强制转换在这里是一个好的选择?使用隐式强制转换和使用重新解释强制转换一样困难,但也许你有很好的理由将其用于void*?@KillianDS:我更改了链接-请查看链接的问题。嗯,你链接到的讨论大多是含糊不清的。看起来很正式不是。请不要传播这些城市神话。它们增加了大量的工作,没有任何优势。请注意,通过
void*
进行两次静态转换的代码与
重新解释转换的代码一样疯狂,但你不再有巨大的闪烁符号。如果你认为这是疯狂的,你应该留下疯狂警告。如果你认为这不是疯狂的,您应该删除crazy-warning.Crazier。那个闪烁的大的crazy警告很重要。不要隐藏它。@spraff-当然,您不应该将reinterpret_cast与指向对象的指针一起使用,除非您绝对确定当前类型
指向A
实际上是类型
指向C
。但是,它仍然是一个糟糕的设计。Befo你不受限制吗