Код, который заполняет jmp_buff
, должен знать, что должно быть слева в стеке после его передачи в longjmp
. Если setjmp
были обработаны как intrinsi c компилятора, который можно было использовать только внутри функции, возвращающей int
, компилятор мог бы упорядочить вещи так, чтобы longjmp
заставил функцию, вызвавшую setjmp
, "вернуть дважды" вместо того, чтобы относиться к самому setjmp
как к такому. Однако во многих реализациях вызовы setjmp
обрабатываются так же, как и любые другие вызовы функций, о которых знания компилятора ограничены прототипом. В таких реализациях у setjmp
не было бы способа организовать возврат longjmp
вызывающей функции без информации о кадре стека этой функции. Хотя компилятор, обрабатывающий вызов setjmp
, будет иметь необходимую информацию, у него не будет причин делать его доступным для setjmp
, а setjmp
не сможет получить информацию без такой поддержки компилятора.
Кстати, более неприятно то, что setjmp
заключается в том, что, хотя для него возможно возвращать значение, вызовы setjmp
должны появляться в очень узком наборе контекстов, ни один из которых не может удобно захватывать возвращаемое значение. Теоретически можно сказать:
int setJmpValue;
switch(setjmp(...))
{
case 0: setJmpValue=0; break;
case 1: setJmpValue=1; break;
...
case INT_MAX-1: setJmpValue = INT_MAX-1; break;
case INT_MAX : setJmpValue = INT_MAX ; break;
}
, но это было бы довольно раздражающим и не могло быть экспортировано в функцию.
Я не думаю, что с разрешением * 1023 должны возникнуть какие-либо трудности. * где i
- это int
длительности stati c или automa c, что, в свою очередь, сделало бы возможным любое произвольное использование возвращаемого значения, но в стандарте такая конструкция не предусмотрена, и компиляторам больше не модно обрабатывать полезные конструкции предсказуемо, за исключением случаев, когда стандарт заставляет их это делать.