嵌入式编程中宏值之间的比较是否有害?

Law*_*uly 0 c c++ embedded macros performance

我正在构建一个需要在ARM上运行的程序.处理器有足够的资源来运行程序,所以这个问题与这种类型的处理器没有直接关系,而是与非强大的处理器有关,资源和计算能力都是"有限的".

要打印调试信息(甚至激活部分代码)我使用头文件,我在其中定义我设置为true或false的宏,如下所示:

#define DEBUG_ADCS_OBC true
Run Code Online (Sandbox Code Playgroud)

在主程序中:

if (DEBUG_ADCS_OBC == true) {
    printf("O2A ");
    for (j = 0; j < 50; j++) {
        printf("%x ", buffer_obc[jj]);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个坏习惯吗?有没有更好的方法来做到这一点?

此外,这些IF检查是否会以可衡量的方式影响绩效?

或者可以安全地假设在编译代码时,IF会以某种方式从流中删除,因为在两个不能更改的值之间进行比较?

das*_*ght 7

由于表达式DEBUG_ADCS_OBC == true可以在编译时进行评估,因此优化编译器会发现分支总是被占用或者总是被绕过,并且完全消除了这个条件.因此,使用优化的编译器时,表达式的运行时成本为零.

如果您在关闭所有优化的情况下进行编译,请改用条件编译.这将使优化编译器对常量表达式执行相同的操作,但是在预处理器阶段.因此,即使关闭优化,编译器也不会"看到"条件.

注1:由于DEBUG_ADCS_OBC具有布尔变量的含义,因此请使用DEBUG_ADCS_OBC不要== true更清晰的外观.

注意2:例如,不要在程序体中定义值,而应考虑在命令行上传递值-DDEBUG_ADCS_OBC=true.这使您可以在不修改源代码的情况下更改调试设置,只需操作make文件或其中一个选项即可.