所以,我有这个程序,我使用
将行号存储在变量中int x = __LINE__;
x的值可以不断变化。 是否可以使用goto或C中的任何其他关键字从任意一行跳到x给出的那一行? 我正在寻找像
这样的东西'keyword' x;
程序转移到由变量x定义的行。
如果无法解决这个问题吗?
答案 0 :(得分:7)
GCC编译器支持using labels as values作为扩展名,以便您可以以类似于您之后的方式使用它们。
它允许你这样做:
void *ptr = &&label;
label:
然后
goto *ptr;
跳转到label
。
这通常在虚拟机的核心内部有用,当然可以导致可怕的意大利面。同样,它也是GCC扩展(我认为也是Clang的支持)。
答案 1 :(得分:0)
不,这是不可能的,实现类似的一种可能的方法是将变量定义为函数指针,并且一旦将变量设置为 你称之为正确的功能。
int foo(int x) {
return x+x;
}
int (*func) (int);
func = foo;
int r = func(3);
答案 2 :(得分:0)
这是可能的,但非常痛苦。假设您有这样的程序:
instruction1;
instruction2;
...
instructionn;
然后您可以将其重写为:
jump:
switch(x) {
case 1:
instruction1;
case 2:
instruction2;
...
case n:
instructionn;
}
然后您可以插入类似的内容:
jump:
switch(x) {
case 1:
instruction1;
case 2:
instruction2;
...
case <something>:
x = <number>;
goto jump;
...
case n:
instructionn;
}
当然,在这样的模式中,你会遇到一些编码像switch
这样的块的问题,但是总是可以用这个给定的形式来翻译它(不是这里解释的地方)。所以,根据你真正需要做的事情,我可能不值得努力。