Optimization 定义常量操作而不在编译时解析它
我的C代码中有以下指令: #定义比例尺156/10 它用于乘以传感器的值。 因为我只处理整数,所以操作是 结果=传感器*刻度Optimization 定义常量操作而不在编译时解析它,optimization,compiler-construction,c-preprocessor,operation,Optimization,Compiler Construction,C Preprocessor,Operation,我的C代码中有以下指令: #定义比例尺156/10 它用于乘以传感器的值。 因为我只处理整数,所以操作是 结果=传感器*刻度 因此,如果传感器读数为10,则正确结果为156。但编译器正在解析它,结果值为150。是否有任何指令告诉编译器不要选择这个特定的#define?这里有问题。正如您所写的,该行应该扩展为result=sensor*156/10,并且*和//code>从左到右关联,因此当sensor==10时,它将被评估为result=(sensor*156)/10,等于156。这不是一个好的
因此,如果传感器读数为10,则正确结果为156。但编译器正在解析它,结果值为150。是否有任何指令告诉编译器不要选择这个特定的#define?这里有问题。正如您所写的,该行应该扩展为
result=sensor*156/10
,并且*
和//code>从左到右关联,因此当sensor==10
时,它将被评估为result=(sensor*156)/10
,等于156
。这不是一个好的做法,但在这种特殊情况下,它应该做你想做的。你确定你发布的是你程序中的代码吗?或者你可能有#define SCALE(156/10)
来代替吗?依赖运算符优先级是一种很糟糕的方法,因为在编写时,你会得到156,但是如果你将它改为result=SCALE*sensor
你会得到150,这使得乘法似乎不会进行转换。更好的方法是使用参数重写宏并强制执行操作顺序,如#define SCALE_VALUE(x)((x)*156)/10)
。或者更好的方法是使用内联函数,不管怎样,这些都与编译器优化无关(除非你的编译器被严重破坏);这完全是关于运算符优先级和整数除法截断的事实。如果计算是在运行时完成的,则会得到相同的结果,只是效率较低。