2016-11-10 65 views
0

所以,我有這個程序,在那裏我存儲在一個變量的行號,使用有沒有辦法跳轉到C中的變量定義的行?

int x = __LINE__; 

x的值可以不斷變化。 使用goto或C中的任何其他關鍵字,是否可以從任意行跳轉到由x給出的行? 我正在尋找類似

'keyword' x; 

其中程序轉移到由變量x所形成的直線。

如果這不可行,是否有解決方法?

+0

我無法想像爲什麼你會想要這樣做...... – tangrs

+0

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

+6

要做到這一點在任何程序中都沒有意義。你試圖解決的實際問題是什麼? – Lundin

回答

7

的GCC編譯器支持,作爲擴展,using labels as values這樣就可以在類似於你以後一種方式與他們合作。

它可以讓你做的事:

void *ptr = &&label; 
label: 

然後

goto *ptr; 

跳轉到label

這在虛擬機的核心內通常很有用,並且當然會導致可怕的意大利麪條。另外,它又是一個GCC擴展(我認爲也支持Clang)。

+0

這就是我正在尋找的東西。我正在編寫一個程序來打印文件中的所有行,從用戶指定的行開始。我意識到有更好的方法來做到這一點,但我只是玩得開心。 – Sashank

0

不,這不是可能,一種可能的方式來實現類似的東西是定義一個變量,函數指針,一旦您已設置的變量 你怎麼稱呼它正確的函數。

int foo(int x) { 
    return x+x; 
} 

int (*func) (int); 
func = foo; 
int r = func(3); 
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這樣的塊的問題,但總是有可能以這種給定的形式翻譯它(不是在這裏解釋如何)。所以根據你真正需要做的事情,我可能不值得付出努力。

相關問題