LINUX.ORG.RU

История изменений

Исправление redbaron, (текущая версия) :

Если руками писать, то компилятор создаст нечто подобное (используются GCC'шные labels as values):

unsigned int x;

//в исходном коде, который компилируем значения в case были такие, что:
// V2 == V1+2; V3 == V2+1; V4 == V3+1; 
const unsigned int  V1 = .. значение V1 из исходного кода ..;


static void* jump_table = { &&l_V1, &&switch_end ,&&l_V2, &&l_V3, &&l_V4 };

if (x < V1) goto switch_end;

goto jump_table[x-V1];
l_V1: ...код в case V1....
l_V2: ....
l_V3: ....
l_V4: ....

switc_end: ... код после switch ... 

Исправление redbaron, :

Если руками писать, то компилятор создаст нечто подобное (используются GCC'шные labels as values):

unsigned int x;

//в исходном коде, который компилируем значения в case были такие, что:
// V2 == V1+2; V3 == V2+1; V4 == V3+1; 
const int  V1 = .. значение V1 из исходного кода ..;


static void* jump_table = { &&l_V1, &&switch_end ,&&l_V2, &&l_V3, &&l_V4 };

if (x < V1) goto switch_end;

goto jump_table[x-V1];
l_V1: ...код в case V1....
l_V2: ....
l_V3: ....
l_V4: ....

switc_end: ... код после switch ... 

Исходная версия redbaron, :

Если руками писать, то компилятор создаст нечто подобное (используются GCC'шные labels as values):

unsigned int x;

const int  V1 = <....>;

//в исходном коде, который компилируем значения в case были такие, что:
// V2 == V1+2; V3 == V2+1; V4 == V3+1; 
statis void* jump_table = { &&l_V1, &&switch_end ,&&l_V2, &&l_V3, &&l_V4 };

if (x < V1) goto switch_end;

goto jump_table[x-V1];
l_V1: ...код в case V1....
l_V2: ....
l_V3: ....
l_V4: ....

switc_end: ... код после switch ...