我正在构建一个需要在 ARM 上运行的程序。 处理器有足够的资源来运行程序,所以这个问题与这种类型的处理器没有直接关系,而是与非强大的处理器有关,资源和计算能力是“有限的”。
为了打印调试信息(甚至激活部分代码),我使用了一个头文件,我在其中定义了设置为 true 或 false 的宏,如下所示:
#define DEBUG_ADCS_OBC true
在主程序中:
if (DEBUG_ADCS_OBC == true) {
printf("O2A ");
for (j = 0; j < 50; j++) {
printf("%x ", buffer_obc[jj]);
}
}
这是坏习惯吗?有没有更好的方法来做到这一点?
此外,进行这些 IF 检查是否会以可衡量的方式影响性能?
或者假设在编译代码时 IF 以某种方式从流程中删除是否安全,因为比较是在两个不能更改的值之间进行的?
最佳答案
由于表达式 DEBUG_ADCS_OBC == true
可以在编译时求值,优化编译器将确定分支总是被采用或总是被绕过,并完全消除该条件。因此,当您使用优化的编译器时,表达式的运行时成本为零。
如果您在关闭所有优化的情况下进行编译,请改用条件编译。这将执行优化编译器对常量表达式执行的相同操作,但在预处理器阶段。因此,即使关闭优化,编译器也不会“看到”条件。
注意1:由于DEBUG_ADCS_OBC
有 bool 变量的含义,所以使用DEBUG_ADCS_OBC
而不用== true
更简洁的外观。
注意 2:与其在程序主体中定义值,不如考虑在命令行上传递一个值,例如 -DDEBUG_ADCS_OBC=true
。这使您无需修改源代码即可更改调试设置,只需操作 make 文件或其选项之一即可。
关于c++ - 嵌入式编程中宏值之间的比较是否不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27425562/