我正在浏览一个项目并遇到了这个问题:
if(!StaticAnimatedEntities)
int esko = esko = 2;
(这里StaticAnimatedEntities
的类型是简单的无符号短文。)
这让我感到非常奇怪,所以我为esko
找到了项目并发现了其他类似的if
只有它们内部的那条线,f.ex。这样:
if(ItemIDMap.find(ID) != ItemIDMap.end())
int esko = esko = 2;
(请注意,在esko
s之外没有名为if
的其他变量。)
这段神秘的代码是什么意思?
答案 0 :(得分:5)
您有时可以看到这样的代码,只是作为一个锚点,在交互式调试器中放置一个断点,以便捕获一些“不寻常”(通常是错误的)条件。
调试器提供的条件断点通常非常慢和/或原始,因此人们经常故意提前计划并提供这样的条件分支,以便为断点创建编译位置。这样一个编译好的条件断点不会像调试器提供的条件断点那样减慢程序执行速度。
在许多情况下,此类代码被#ifndef NDEBUG/#endif
包围,以防止它进入生产版本。在其他情况下,人们只是让它不受保护,相信优化编译器无论如何都会将其删除。
为了使其工作,if
下的代码应该在调试版本中生成一些机器代码。否则,就不可能在其上设置断点。不同的人在这方面有不同的偏好,但代码几乎总是看起来很奇怪而且毫无意义。
该代码的无意义使程序员可以完全自由地编写他们想要的任何东西。而且我会说它经常成为每个程序员签名风格的一部分,是各种指纹。有问题的人显然是int esko = esko = 2;
。