// static void hoge_impl(void *p) {
#define return goto
  if (A_init() != 0) return A_FAILED;
  if (B_init() != 0) return B_FAILED;
  if (C_init() != 0) return C_FAILED;
  if (D_init() != 0) return D_FAILED;
#undef return
  return 0;
// }
// void hoge() {
// switch (hoge_impl(p)) {
#define case label
case D_FAILED:
  D_finish();
case C_FAILED:
  C_finish();
case B_FAILED:
  B_finish();
case A_FAILED:
  A_finish();
  return -1;
#undef case
// default:
//   return 0;
// }