带有空块的 if 语句 gcc 编译器优化行为

if statement with empty block gcc compiler optimization behaviour

我有这个C代码

char msg[] = "hello";
int expr = some_function_giving_back_integers();
if(expr) {
    _dbFunction(msg);
}

其中_dbFunction();定义如下

#define DBGFL 1
#define _dbFunction(msg) \
    do { if (DBGFL) {\
        fprintf(stderr, "%s\n", msg); \
    }} while (0)

我读到上面是调试的最佳实践,因为编译器在使用 #define DBGFL 0 编译时通过删除 if 语句来处理 if (0) 以进行优化,并遵循相同的do { } while (0).

我的问题是:就主要代码而言,当预处理器用空语句替换_dbFunction(msg)时,即使expr可以在运行时都是 0 或 !=0,编译器是否足够聪明以删除整个 if 并避免比较?

我知道我可能可以通过查看生成的汇编代码来回答自己,但是,我仍然不习惯反汇编可执行文件,我需要了解如何优化我的代码,因为上面的内容很长-运行 循环。

感谢C专家的一些回答。 提前致谢。

编译 clang -O3

int main(int argc, char *argv[])
{
    if (argc > 1) {
        do {
            if (0) {
                printf("foo");
            }
        } while (0);
    }
    return 0;
}

生成的代码就是:

main:                                   # @main
        xor     eax, eax
        ret

第一行将 0 加载到用于 return 值的寄存器中,第二行 returns。 argc 的测试被优化掉了。

https://godbolt.org/z/aYE5hc

如果 if 条件有副作用,则必须执行。