所以,我有這個程序,在那裏我存儲在一個變量的行號,使用有沒有辦法跳轉到C中的變量定義的行?
int x = __LINE__;
x的值可以不斷變化。 使用goto或C中的任何其他關鍵字,是否可以從任意行跳轉到由x給出的行? 我正在尋找類似
'keyword' x;
其中程序轉移到由變量x所形成的直線。
如果這不可行,是否有解決方法?
所以,我有這個程序,在那裏我存儲在一個變量的行號,使用有沒有辦法跳轉到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