История изменений
Исправление 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 ...