2010-08-05 93 views
-6

我已經閱讀了下面的教程,但我不太明白。何時使用longjmp以及爲什麼需要知道?何時以及爲什麼在C++中使用longjmp?

http://www.cplusplus.com/reference/clibrary/csetjmp/longjmp/

+4

如果您希望我們不要低估您的問題,您必須努力不迫使我們給予低估。你有什麼不明白?爲什麼有必要知道**什麼**?你的問題太模糊了;這並不是說我們不想幫助你,而是我們找不到幫助你的方法,因爲我們無法理解你確切的問題。 (如果這讓你感覺更好,我不會冷靜地回答問題,至少現在不會。) – BoltClock 2010-08-05 13:02:45

+7

@davit - 你一次又一次無法理解Stack Overflow中提出的問題類型是否合理。在你所有的問題中,你都會得到很多關於如何去了解你所需要的建議,並且你會繼續回答一些荒謬的問題。不要感到驚訝,他們一直在投票並關閉。 – 2010-08-05 13:06:21

+1

這不是教程。這是一個API參考。它不會告訴你爲什麼這是必要的。它只是告訴你如何使用它,如果你認爲有必要出於任何原因。 – DLH 2010-08-05 13:08:24

回答

5

setjmp/longjmp是一種老式的處理異常的方式。首先,您使用setjmp()設置跳轉點。然後,從程序中的其他任何地方,您可以跳回到longjmp()。如果你的程序可以使用異常 - 而且現在大多數程序可以使用 - 那麼你不需要使用這些功能。

+1

除非您從不使用具有不平凡析構函數的類,否則不能使用'setjmp' /'longjmp'作爲C++中異常處理的替代方法。他們不會放棄堆棧,所以最終會泄漏資源到處。 – 2010-08-05 15:04:43

+2

嚴格來說,使用它跳出* any *自動變量的範圍是未定義的行爲。 – 2010-08-05 15:09:00

15

只是不要使用它。

唯一一次你想在C++中使用它永遠不會。你永遠不應該有任何理由在一個寫得很好的C++程序中使用它(事實上,你永遠不應該有任何理由在一個寫得不好的C++程序中使用它)。

+8

+1我從來沒有使用過這個功能,我沒事。 – 2010-08-05 13:07:27

+1

我用過一次,目的太難以描述。我想我現在好了。 – 2010-08-05 17:34:33

4

在C++中,它沒有被使用,也沒有必要知道,是簡短的。

3

簡而言之,setjmplongjmp是一種改變程序中控制流的方法。他們的工作是這樣的:

  1. 您致電setjmp。該函數返回一個令牌,jmp_buf
  2. 你走開並做其他事情。
  3. 您致電longjmp並將其從setjmp中獲得的令牌傳遞給它。當你這樣做時,程序將返回到你撥打setjmp的地方。不管你是否在另一個功能。這就像是一個關於類固醇的GOTO聲明,帶來了類似的所有優點和缺點。

正如以前的海報所說,不要使用它。你可以打結,因爲你的程序中的控制流程正在移動。但是,setjmp/longjmp確實有實際用途。例如,它們可以用來模擬C中的異常。但是一般來說,它們比它們的價值更麻煩!

相關問題