确定空无限循环的编译器行为的最佳方法是什么?

What is my best approach to determining compiler behaviour for empty infinite loops?

本文关键字:最佳 方法 是什么 编译器 无限循环      更新时间:2023-10-16

在C 11中,具有空体的无限环具有未定义的行为。我不知道它是否也在C中,所以假设我在C 11中编写嵌入式固件(我知道,不太可能,但请忍受)。

如果我的 main只是一个:

while (true) {}

和设备的其余功能是通过中断处理的,我可以采用哪些方法来发现我的实现是否使该循环安全有意义?记住,根据标准,在这种情况下可以免费执行实施方式,包括完全删除循环。

假设实现文档中没有清楚地说明它,因为我从未见过。

还是这是一个失去的原因,我应该入侵解决方案?

volatile unsigned int dummy = 0;
while (true) {
   // Make the loop well-defined...
   dummy++;
   // ...with a trivial operation that'll hardly ever even happen
   sleep(42*86400);
}

我认识到,历史上嵌入的开发人员对这种事情并不多,而是假设编译器的"脚踏实地","常识"方法。但是我更喜欢用严格地编码标准,以避免尽可能多的惊喜。

如何查看编译器的汇编语言输出?

g++ -std=c++0x x.cpp -S

输出:

.L2:
        jmp     .L2

clang++-3.5 -S -std=c++11 x.cpp

输出:

.LBB0_1:                                # =>This Inner Loop Header: Depth=1
        jmp     .LBB0_1