脱出

setjmp() とか使うとプログラムが読みづらくなりますよーというお話。(嘘*1

#include <stdlib.h>
#include <stdio.h>
#include <setjmp.h>

struct _env_stack { jmp_buf env; struct _env_stack *next; } *_env_stack;
struct _env_stack *_push_env() {
    struct _env_stack *e = malloc(sizeof(*e));
    e->next = _env_stack, _env_stack = e;
    return e;
}
int _pop_env() {
    _env_stack = _env_stack->next;
    return 1;
}
void *_exc;
#define try      if (!(_exc = (void *)setjmp(_push_env()->env))) {
#define catch(e) _pop_env(); } else if (e = _exc, _pop_env())
#define throw(e) longjmp(_env_stack->env, (int)(e))

int main()
{
    char *message;
    try {
        try {
            printf("Step 1\n");
            throw("Error!");
            printf("Step 2\n");
        } catch (message) {
            printf("Exception: %s\n", message);
            printf("Step 3\n");
            throw("Hoge!");
            printf("Step 4\n");
        }
    } catch (message) {
        printf("Exception: %s\n", message);
    }
    return 0;
}

try の中から return とかで脱出しちゃったりした日にゃもう大変な事に。

*1:本当は #define とか使うとプログラムが読みづらくなりますよーというお話です。(ぇ