防止C ++ 11删除无限循环

时间:2014-06-19 03:30:40

标签: c++ c++11 embedded

正如this question中所讨论的,C ++ 11优化了无限循环。

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

有没有一种优雅的方法可以告诉编译器不要删除空循环或无限循环,而不会完全禁用优化?

1 个答案:

答案 0 :(得分:9)

要删除循环的要求之一(如该问题中所述)是

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

所以,

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();
}