Используя GCC (4.0 для меня), это законно:
if(__builtin_expect(setjmp(buf) != 0, 1))
{
// handle error
}
else
{
// do action
}
Я нашел обсуждение, в котором говорилось, что это вызвало проблему для GCC еще в 2003 году, но я полагаю, что они уже исправили ее. Стандарт C говорит, что использование setjmp
запрещено, если только это не одно из четырех условий, релевантным из которых является следующее:
- один операнд оператора отношения или оператора равенства с другим операндом целочисленного константного выражения, при этом результирующее выражение является полным управляющим выражением оператора выбора или итерации;
Но если это расширение GCC, могу ли я гарантировать, что оно будет работать под GCC, так как это уже нестандартный функционал? Я протестировал его, и, похоже, он работал, хотя я не знаю, сколько тестов мне пришлось бы сделать, чтобы действительно сломать его. (Я прячу вызов __builtin_expect
за макросом, который определяется как недействующий для не-GCC, поэтому он будет совершенно законным для других компиляторов.)
__builtin_expect
там? Я бы ожидал, что GCC будет рассматриватьsetjmp
как особый случай и оптимизировать для общего пути. Этот шаблон очень редко встречается в поиске кода Google: google.com/ - person Giuseppe Ottaviano   schedule 07.01.2011__builtin_expect
— нелепая преждевременная оптимизация, которая искажает код с сомнительной выгодой. Если у gcc есть встроенныйsetjmp
, он мог бы даже оптимизировать все условное выражение, заставивsetjmp
хранить адрес недостижимого в противном случае кода для ненулевого условия непосредственно в буфере перехода, поэтому я думаю, что мы действительно имеем дело с преждевременной оптимизацией, считающейся вредной здесь. . - person R.. GitHub STOP HELPING ICE   schedule 07.01.2011