18 c c++ goto jump-table
我想声明一个"jumplabels"数组.
然后我想跳到这个数组中的"jumplabel".
但我不知道该怎么做.
它应该类似于以下代码:
function()
{
"gotolabel" s[3];
s[0] = s0;
s[1] = s1;
s[2] = s2;
s0:
....
goto s[v];
s1:
....
goto s[v];
s2:
....
goto s[v];
}
Run Code Online (Sandbox Code Playgroud)
有谁知道如何执行此操作?
qrd*_*rdl 40
GCC功能可以称为" 标签作为值 ".
void *s[3] = {&&s0, &&s1, &&s2};
if (n >= 0 && n <=2)
goto *s[n];
s0:
...
s1:
...
s2:
...
Run Code Online (Sandbox Code Playgroud)
它只适用于GCC!
laa*_*lto 17
goto
需要一个编译时标签.
从这个例子看,你似乎正在实现某种状态机.最常见的是,它们被实现为switch-case结构:
while (!finished) switch (state) {
case s0:
/* ... */
state = newstate;
break;
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
如果需要它更动态,请使用函数指针数组.
lis*_*ine 12
没有直接的方法来存储代码地址以跳转到C.如何使用开关.
#define jump(x) do{ label=x; goto jump_target; }while(0)
int label=START;
jump_target:
switch(label)
{
case START:
/* ... */
case LABEL_A:
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
您可以找到每个无堆栈解析器/状态机生成器生成的类似代码.这样的代码不容易遵循,所以除非它是生成代码或你的问题最容易被状态机描述,我建议不要这样做.
你可以使用函数指针而不是goto吗?
这样你就可以创建一个函数数组来调用和调用适当的函数.
这就是switch
陈述的内容.
switch (var)
{
case 0:
/* ... */
break;
case 1:
/* ... */
break;
default:
/* ... */
break; /* not necessary here */
}
Run Code Online (Sandbox Code Playgroud)
请注意,它不一定由编译器转换为跳转表.
如果你真的想自己构建跳转表,可以使用函数指针数组.