Я думаю, что стандарт говорил о том, чтобы сделать что-то вроде этого:
int x = printf("howdy");
if (setjmp(buf) != x ) {
function_that_might_call_longjmp_with_x(buf, x);
} else {
do_something_about_them_errors();
}
В этом случае вы не могли бы полагаться на x
, имеющее значение, которое было назначено впредыдущая строка больше.Компилятор, возможно, переместил место, где был x
(повторно использовав регистр, в котором он находился, или что-то в этом роде), поэтому код, который выполнял сравнение, выглядел бы не в том месте.(вы можете сохранить x
в другой переменной, а затем переназначить x
в другое значение перед вызовом функции, что может сделать проблему более очевидной)
В своем коде вы могли бы написать это как:
int conditional;
conditional = setjump(buf) != 0 ;
if(__builtin_expect( conditional, 1)) {
// handle error
} else {
// do action
}
И я думаю, что мы можем убедиться, что строка кода, которая присваивает переменную conditional
, отвечает этому требованию.