编译器如何解决?进行哪个隐式转换?它是否经过优化,以使条件始终为真?以下代码将始终安全吗?还是取决于编译器。
#define MaxCfgDev 500
uint8 numdev;
.
.
.
if(numdev < MaxCfgDev)
.
.
.
我知道乍一看与超出限制的数字进行比较可能没有任何意义,但可以想象一下,这个MaxCfgDev
的定义不是那么明显,而是来自另一个复杂的定义,也许来自来自外部模块的其他定义并且该特定模块仅需要检查numdev
是否低于某些系统级定义或其他任何内容。
答案 0 :(得分:1)
#define
在运行编译器之前执行符号替换。因此,替换后的条件将完全等于:
if(numdev < 500)
MaxCfgDev
的定义有多“明显”无关紧要。如果计算得出的编译时间常数为256或更大,则该条件将始终为真,并且编译器可能会优化测试。
答案 1 :(得分:0)
在比较之前,Numdev被提升为int
。