if内部奇怪的无副作用声明的含义

Meaning of weird side-effectless statement inside if

本文关键字:声明 无副作用 if 内部      更新时间:2023-10-16

我浏览了一个项目,发现了这个:

if(!StaticAnimatedEntities)
  int esko = esko = 2;

(这里的StaticAnimatedEntities类型是一个普通的无符号short。(

这让我觉得很奇怪,所以我把esko的项目搞砸了,发现了其他类似的if,里面只有那条线,例如:

if(ItemIDMap.find(ID) != ItemIDMap.end())
  int esko = esko = 2;

(请注意,除了if之外,没有其他名为esko的变量。(

这段神秘的代码是什么意思?

您有时可以看到这样的代码,只是作为一个锚点位置,在交互式调试器中放置断点,以捕获一些"不寻常"(最常见的错误(情况。

调试器提供的条件断点通常非常缓慢和/或原始,因此人们通常会故意提前计划并提供这样的条件分支,以便为断点创建编译位置。这种编译的条件断点不会像调试器提供的条件断点那样降低程序执行速度。

在许多情况下,此类代码被#ifndef NDEBUG/#endif包围,以防止其进入生产构建。在其他情况下,人们只是不保护它,认为优化编译器无论如何都会删除它。

为了使其工作,if下的代码应该在调试构建中生成一些机器代码。否则,就不可能在上面设置断点。不同的人在这方面有不同的偏好,但代码实际上总是看起来很奇怪,毫无意义。

正是这些代码的无意义性为程序员提供了在那里编写任何他们想要的东西的完全自由。我想说,它经常成为每个程序员签名风格的一部分,一种指纹。显然,这个人做int esko = esko = 2;