3

I was browsing through a project and came across this:

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

(The type of StaticAnimatedEntities here is a plain unsigned short.)

It struck me as very odd so I grepped the project for esko and found other similar ifs with nothing but that line inside them, f.ex. this:

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

(Note that there are no other variables named esko outside those ifs.)

What is the meaning of this cryptic piece of code?

4

1 回答 1

5

您有时可以看到这样的代码只是用作在交互式调试器中放置断点的锚位置,以捕获一些“不寻常”(最常见 - 错误)条件。

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

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

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

正是该代码的无意义为程序员提供了在其中编写任何他们想要的任何东西的完全自由。而且我想说它经常成为每个程序员签名风格的一部分,一种指纹。显然,有问题的人确实如此int esko = esko = 2;

于 2015-07-24T05:07:56.027 回答