GCC(私にとっては4.0)を使用すると、これは合法です:
if(__builtin_expect(setjmp(buf) != 0, 1))
{
// handle error
}
else
{
// do action
}
2003 年に GCC で問題が発生したという議論を見つけましたが、今では修正されていると思います。setjmpC 標準では、次の 4 つの条件のいずれかである場合を除き、使用は違法であると規定されています。
- 関係演算子または等値演算子の 1 つのオペランドと、他のオペランドが整数定数式であり、結果の式が選択ステートメントまたは反復ステートメントの制御式全体になります。
しかし、これが GCC 拡張機能である場合、GCC で動作することを保証できますか? 既に非標準の機能であるためです。私はそれをテストし、実際にそれを破るためにどれだけのテストをしなければならないかわかりませんが、うまくいくように見えました. __builtin_expect(非 GCC の no-op として定義されているマクロの背後に呼び出しを隠しているため、他のコンパイラでは完全に合法です。)