防止c++ 11移除无限循环

Prevent C++11 removal of endless loops

本文关键字:无限循环 c++ 防止      更新时间:2023-10-16

正如本问题所讨论的,c++ 11优化了无限循环。

然而,在具有单一目的的嵌入式设备中,无限循环是有意义的,并且实际上经常使用。即使是完全空的while(1);对于看门狗辅助复位也是有用的。终止但是空循环在嵌入式开发中也很有用。

是否有一种优雅的方式来明确地告诉编译器不要删除空循环或无限循环,而不会完全禁用优化?

要删除循环的一个要求(正如在那个问题中提到的)是它

  • 不能访问或修改易失性对象

void wait_forever(void)
{
    volatile int i = 1;
    while (i) ;
}

应该完成这个任务,尽管我肯定会通过查看使用您的特定工具链生成的程序的反汇编来验证这一点。

这样的函数也是GCC的noreturn属性的一个很好的候选。

void wait_forever(void) __attribute__ ((noreturn));
void wait_forever(void)
{
    volatile int i = 1;
    while (i) ;
}
int main(void)
{
    if (something_bad_happened)
        wait_forever();
}