使用 GCC(对我来说是 4.0)是否合法:
if(__builtin_expect(setjmp(buf) != 0, 1))
{
// handle error
}
else
{
// do action
}
我发现一个讨论说它在 2003 年给 GCC 带来了问题,但我想他们现在应该已经解决了。C标准说,setjmp
除非它是四个条件之一,否则使用是非法的,相关的一个是:
- 关系或相等运算符的一个操作数与另一个操作数是整数常量表达式,结果表达式是选择或迭代语句的整个控制表达式;
但如果这是一个 GCC 扩展,我能否保证它适用于 GCC,因为它已经是非标准功能?我对它进行了测试,它似乎可以工作,但我不知道我需要做多少测试才能真正打破它。(我将调用隐藏__builtin_expect
在宏后面,该宏被定义为非 GCC 的无操作,因此对于其他编译器来说是完全合法的。)