setjmp和GCC的合法用法
使用GCC(4.0 for me),这是合法的:
if(__builtin_expect(setjmp(buf) != 0, 1))
{
// handle error
}
else
{
// do action
}
我发现一个讨论说它在2003年给GCC造成了问题,但我想他们现在已经修好了。 C标准说使用setjmp
是违法的,除非它是四个条件之一,相关的是这个:
关系或等于运算符的一个操作数与另一个操作数的整数常量表达式,结果表达式是选择或迭代语句的整个控制表达式;
但如果这是GCC扩展,我可以保证它可以用于GCC,因为它已经是非标准功能吗?我测试了它似乎工作,但我不知道我必须做多少测试来实际打破它。 (我隐藏了一个宏后面的__builtin_expect
的调用,这被定义为非GCC的无操作,所以对其他编译器来说这是完全合法的。)
没有找到相关结果
已邀请:
2 个回复
钨蜡唤喉晤
仿普
在这种情况下,您不能再依赖于具有在上一行中分配的值的
。编译器可能已移动了
所在的位置(重新使用它所在的寄存器或其他内容),因此进行比较的代码将查找错误的位置。 (你可以将
保存到另一个变量,然后在调用函数之前将
重新分配给其他东西,这可能会使问题更加明显) 在您的代码中,您可以将其写为:
而且我认为我们可以满足自己,分配变量
的代码行满足了这个要求。