, , , , , ansi C, , . , stackoverflow, "" addr , , , gcc/clang non ansi, asm.
tonite .
include cgoto.h
#ifndef CGOTO_dcl
#define CGOTO_dcl(N) int CGOTO_##N
#define CGOTO_LE(l) l,
#define CGOTO_LG(l) case l:goto l;
#define CGOTO_def(N) \
if(0){typedef enum {N(CGOTO_LE)} N; CGOTO_##N: switch(CGOTO_##N)\
{N(CGOTO_LG) default:CGOTO_##N=0;goto CGOTO_##N;}}
#define CGOTO(N,i) CGOTO_##N=i; goto CGOTO_##N;
#endif
#include <stdio.h>
#include "cgoto.h"
int f(int x)
{
CGOTO_dcl(gtb);
# define gtb(L) L(l0) L(l1) L(l2)
CGOTO_def(gtb);
CGOTO(gtb,x);
l0: printf("error\n");
return(0);
l1:return(11);
l2:return(22);
l3:return(33);
}
int main()
{ printf("f(0)=%d f(1)=%d f(2)=%d,f(3)=%d\n",f(0),f(1),f(2),f(3));
}
- 2 (), , . , , , && label .
( ) (), .
goto_table_index, (multi threadable), .
1- "" ( ) , , - "". , , 1- .
CGOTO_dcl(gtb);
"gtb" , .
# define gtb(L) L(l0) L(l1) L(l2)
CGOTO_def(gtb);
gtb, / L (label), , , . #define switch(), / #define , .
#define CGOTO_def(), . CGOTO_def(), , , (), .
uniq .
CGOTO(gtb,x);
...
CGOTO(gtb,y);
# define gtb1(L) L(l0) L(l1) L(l2)
CGOTO_def(gtb1);
# define gtb2(L) L(l0) L(l4) L(l5)
CGOTO_def(gtb2);
, , , 2 : #define CGOTO_def(), , .
FTN4:)
Cheers,
Phi