编译器是如何解决这个问题的?携带哪种隐式转换?它是否经过优化,使得条件总是正确的?以下代码是否始终安全?或者取决于编译器。
#define MaxCfgDev 500
uint8 numdev;
.
.
.
if(numdev < MaxCfgDev)
.
.
.
我知道第一眼比较一个超出限制的数字可能是没有意义的,但是假设这个
MaxCfgDev
不是很明显的定义,而是来自另一个复杂的定义,可能来自来自外部模块的其他定义,这个特定的模块只需要检查numdev
是否低于某些系统级定义或其他定义。 最佳答案
#define
在编译器运行之前执行符号替换。因此,替换后的条件将完全等同于:
if(numdev < 500)
MaxCfgDev
的定义有多“明显”并不重要。如果其计算结果为256或更大的编译时常数,则条件将始终为true,编译器可能会优化测试。