有没有办法跳转到C中的变量定义的行?
所以,我有这个程序,在那里我存储在一个变量的行号,使用有没有办法跳转到C中的变量定义的行?
int x = __LINE__;
x的值可以不断变化。 使用goto或C中的任何其他关键字,是否可以从任意行跳转到由x给出的行? 我正在寻找类似
'keyword' x;
其中程序转移到由变量x所形成的直线。
如果这不可行,是否有解决方法?
的GCC编译器支持,作为扩展,using labels as values这样就可以在类似于你以后一种方式与他们合作。
它可以让你做的事:
void *ptr = &&label;
label:
然后
goto *ptr;
跳转到label
。
这在虚拟机的核心内通常很有用,并且当然会导致可怕的意大利面条。另外,它又是一个GCC扩展(我认为也支持Clang)。
这就是我正在寻找的东西。我正在编写一个程序来打印文件中的所有行,从用户指定的行开始。我意识到有更好的方法来做到这一点,但我只是玩得开心。 – Sashank
不,这不是可能,一种可能的方式来实现类似的东西是定义一个变量,函数指针,一旦您已设置的变量 你怎么称呼它正确的函数。
int foo(int x) {
return x+x;
}
int (*func) (int);
func = foo;
int r = func(3);
这是可能的,但非常痛苦。假设你有一个这样的程序:
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
这样的块的问题,但总是有可能以这种给定的形式翻译它(不是在这里解释如何)。所以根据你真正需要做的事情,我可能不值得付出努力。
我无法想像为什么你会想要这样做...... – tangrs
有计算gotos的唯一方法是通过'switch'。 – 2016-11-10 12:36:00
要做到这一点在任何程序中都没有意义。你试图解决的实际问题是什么? – Lundin