有没有办法跳转到C中的变量定义的行?

问题描述:

所以,我有这个程序,在那里我存储在一个变量的行号,使用有没有办法跳转到C中的变量定义的行?

int x = __LINE__; 

x的值可以不断变化。 使用goto或C中的任何其他关键字,是否可以从任意行跳转到由x给出的行? 我正在寻找类似

'keyword' x; 

其中程序转移到由变量x所形成的直线。

如果这不可行,是否有解决方法?

+0

我无法想像为什么你会想要这样做...... – tangrs

+0

有计算gotos的唯一方法是通过'switch'。 – 2016-11-10 12:36:00

+6

要做到这一点在任何程序中都没有意义。你试图解决的实际问题是什么? – Lundin

的GCC编译器支持,作为扩展,using labels as values这样就可以在类似于你以后一种方式与他们合作。

它可以让你做的事:

void *ptr = &&label; 
label: 

然后

goto *ptr; 

跳转到label

这在虚拟机的核心内通常很有用,并且当然会导致可怕的意大利面条。另外,它又是一个GCC扩展(我认为也支持Clang)。

+0

这就是我正在寻找的东西。我正在编写一个程序来打印文件中的所有行,从用户指定的行开始。我意识到有更好的方法来做到这一点,但我只是玩得开心。 – 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这样的块的问题,但总是有可能以这种给定的形式翻译它(不是在这里解释如何)。所以根据你真正需要做的事情,我可能不值得付出努力。