我已經閱讀了下面的教程,但我不太明白。何時使用longjmp以及爲什麼需要知道?何時以及爲什麼在C++中使用longjmp?
http://www.cplusplus.com/reference/clibrary/csetjmp/longjmp/
我已經閱讀了下面的教程,但我不太明白。何時使用longjmp以及爲什麼需要知道?何時以及爲什麼在C++中使用longjmp?
http://www.cplusplus.com/reference/clibrary/csetjmp/longjmp/
setjmp/longjmp是一種老式的處理異常的方式。首先,您使用setjmp()
設置跳轉點。然後,從程序中的其他任何地方,您可以跳回到longjmp()
。如果你的程序可以使用異常 - 而且現在大多數程序可以使用 - 那麼你不需要使用這些功能。
除非您從不使用具有不平凡析構函數的類,否則不能使用'setjmp' /'longjmp'作爲C++中異常處理的替代方法。他們不會放棄堆棧,所以最終會泄漏資源到處。 – 2010-08-05 15:04:43
嚴格來說,使用它跳出* any *自動變量的範圍是未定義的行爲。 – 2010-08-05 15:09:00
只是不要使用它。
唯一一次你想在C++中使用它永遠不會。你永遠不應該有任何理由在一個寫得很好的C++程序中使用它(事實上,你永遠不應該有任何理由在一個寫得不好的C++程序中使用它)。
+1我從來沒有使用過這個功能,我沒事。 – 2010-08-05 13:07:27
我用過一次,目的太難以描述。我想我現在好了。 – 2010-08-05 17:34:33
在C++中,它沒有被使用,也沒有必要知道,是簡短的。
簡而言之,setjmp
和longjmp
是一種改變程序中控制流的方法。他們的工作是這樣的:
setjmp
。該函數返回一個令牌,jmp_buf
longjmp
並將其從setjmp
中獲得的令牌傳遞給它。當你這樣做時,程序將返回到你撥打setjmp
的地方。不管你是否在另一個功能。這就像是一個關於類固醇的GOTO
聲明,帶來了類似的所有優點和缺點。正如以前的海報所說,不要使用它。你可以打結,因爲你的程序中的控制流程正在移動。但是,setjmp
/longjmp
確實有實際用途。例如,它們可以用來模擬C中的異常。但是一般來說,它們比它們的價值更麻煩!
如果您希望我們不要低估您的問題,您必須努力不迫使我們給予低估。你有什麼不明白?爲什麼有必要知道**什麼**?你的問題太模糊了;這並不是說我們不想幫助你,而是我們找不到幫助你的方法,因爲我們無法理解你確切的問題。 (如果這讓你感覺更好,我不會冷靜地回答問題,至少現在不會。) – BoltClock 2010-08-05 13:02:45
@davit - 你一次又一次無法理解Stack Overflow中提出的問題類型是否合理。在你所有的問題中,你都會得到很多關於如何去了解你所需要的建議,並且你會繼續回答一些荒謬的問題。不要感到驚訝,他們一直在投票並關閉。 – 2010-08-05 13:06:21
這不是教程。這是一個API參考。它不會告訴你爲什麼這是必要的。它只是告訴你如何使用它,如果你認爲有必要出於任何原因。 – DLH 2010-08-05 13:08:24