Files
hustoj/web/cppreference-zh/chmhelp/c-program-longjmp.html
2025-08-01 12:57:54 +08:00

193 lines
11 KiB
HTML

<!DOCTYPE html>
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>longjmp</title>
<link rel="stylesheet" href="ext.css" />
<link rel="stylesheet" href="site_modules.css" />
</head>
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-c_program_longjmp skin-cppreference2 action-view cpp-navbar">
<div id="cpp-content-base">
<div id="content"><a id="top"></a>
<h1 id="firstHeading" class="firstHeading">longjmp</h1>
<div id="bodyContent">
<div id="contentSub"><span class="subpages">&lt; <a href="c.html">c</a>&lrm; | <a href="c-program.html">program</a></span></div>
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
<table class="t-dcl-begin">
<tbody>
<tr class="t-dsc-header">
<td>
<div>&#23450;&#20041;&#20110;&#22836;&#25991;&#20214; <code>&lt;setjmp.h&gt;</code></div>
</td>
<td></td>
<td></td>
</tr>
</tbody>
<tbody class="t-dcl-rev">
<tr class="t-dcl t-until-c11">
<td>
<div><span class="mw-geshi c source-c"><span class="kw4">void</span> longjmp<span class="br0">(</span> <a href="c-program-jmp_buf.html"><span class="kw510">jmp_buf</span></a> env, <span class="kw4">int</span> status <span class="br0">)</span><span class="sy4">;</span></span></div>
</td>
<td class="t-dcl-nopad"></td>
<td><span class="t-mark-rev t-until-c11">(C11 &#21069;)</span></td>
</tr>
<tr class="t-dcl t-since-c11">
<td>
<div><span class="mw-geshi c source-c">_Noreturn <span class="kw4">void</span> longjmp<span class="br0">(</span> <a href="c-program-jmp_buf.html"><span class="kw510">jmp_buf</span></a> env, <span class="kw4">int</span> status <span class="br0">)</span><span class="sy4">;</span></span></div>
</td>
<td class="t-dcl-nopad"></td>
<td><span class="t-mark-rev t-since-c11">(C11 &#36215;)</span></td>
</tr>
</tbody>
<tbody>
<tr class="t-dcl-sep">
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<p>&#36733;&#20837;&#20808;&#21069;&#35843;&#29992; <span class="t-lc"><a href="c-program-setjmp.html">setjmp</a></span> &#20445;&#23384;&#30340;&#25191;&#34892;&#29615;&#22659; <code>env</code> &#12290;&#27492;&#20989;&#25968;&#19981;&#36820;&#22238;&#12290;&#36716;&#31227;&#25511;&#21046;&#27969;&#21040;&#35774;&#32622; <code>env</code> &#30340;&#23439; <span class="t-lc"><a href="c-program-setjmp.html">setjmp</a></span> &#30340;&#35843;&#29992;&#26041;&#12290;&#35813; <span class="t-lc"><a href="c-program-setjmp.html">setjmp</a></span> &#20250;&#36820;&#22238;&#20316;&#20026; <code>status</code> &#20256;&#36882;&#30340;&#20540;&#12290;</p>
<p>&#33509;&#35843;&#29992; <span class="t-lc"><a href="c-program-setjmp.html">setjmp</a></span> &#30340;&#20989;&#25968;&#24050;&#36864;&#20986;&#65288;&#36890;&#36807;&#36820;&#22238;&#25110;&#36890;&#36807;&#21478;&#19968;&#21040;&#26632;&#19978;&#26356;&#39640;&#22788;&#30340; <code>longjmp</code> &#65289;&#65292;&#21017;&#34892;&#20026;&#26410;&#23450;&#20041;&#12290;&#25442;&#35328;&#20043;&#65292;&#21482;&#26377;&#35843;&#29992;&#26632;&#38388;&#30340;&#38271;&#36339;&#36716;&#26159;&#20801;&#35768;&#30340;&#12290;</p>
<table class="t-rev-begin">
<tr class="t-rev t-since-c11">
<td>
<p>&#36328;&#32447;&#31243;&#36339;&#36716;&#65288;&#33509;&#35843;&#29992; <code>setjmp</code> &#30340;&#20989;&#25968;&#34987;&#21478;&#19968;&#32447;&#31243;&#25191;&#34892;&#65289;&#20134;&#26159;&#26410;&#23450;&#20041;&#34892;&#20026;&#12290;</p>
</td>
<td><span class="t-mark-rev t-since-c11">(C11 &#36215;)</span></td>
</tr>
</table>
<table class="t-rev-begin">
<tr class="t-rev t-since-c99">
<td>
<p>&#33509;&#22312;&#35843;&#29992; <span class="t-lc"><a href="c-program-setjmp.html">setjmp</a></span> &#26102;&#65292; <a href="c-language-array.html">VLA</a> &#25110;&#20854;&#20182;<a href="c-language-declarations.html">&#21487;&#21464;&#20462;&#25913;&#31867;&#22411;</a>&#21464;&#37327;&#22312;&#20316;&#29992;&#22495;&#20013;&#65292;&#24182;&#19988;&#25511;&#21046;&#27969;&#31163;&#24320;&#20102;&#35813;&#20316;&#29992;&#22495;&#65292;&#21017; <code>longjmp</code> &#21040;&#35813; <code>setjmp</code> &#23558;&#24341;&#21457;&#26410;&#23450;&#20041;&#34892;&#20026;&#65292;&#21363;&#20351;&#25511;&#21046;&#27969;&#20173;&#28982;&#30041;&#22312;&#35813;&#20989;&#25968;&#20869;&#12290;</p>
<p>&#22312;&#19978;&#28335;&#26632;&#30340;&#36884;&#20013;&#65292; <code>longjmp</code> &#19981;&#20250;&#35299;&#20998;&#37197;&#20219;&#20309; VLA &#65292;&#33509;&#20854;&#30340;&#29983;&#23384;&#26399;&#20197;&#27492;&#26041;&#24335;&#32456;&#32467;&#65292;&#21017;&#20250;&#20986;&#29616;&#20869;&#23384;&#27844;&#28431;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="c source-c">
<pre class="de1"><span class="kw4">void</span> g<span class="br0">(</span><span class="kw4">int</span> n<span class="br0">)</span>
<span class="br0">{</span>
<span class="kw4">int</span> a<span class="br0">[</span>n<span class="br0">]</span><span class="sy4">;</span> <span class="co1">// a &#20173;&#20026;&#24050;&#20998;&#37197;</span>
h<span class="br0">(</span>n<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#19981;&#36820;&#22238;</span>
<span class="br0">}</span>
<span class="kw4">void</span> h<span class="br0">(</span><span class="kw4">int</span> n<span class="br0">)</span>
<span class="br0">{</span>
<span class="kw4">int</span> b<span class="br0">[</span>n<span class="br0">]</span><span class="sy4">;</span> <span class="co1">// b &#20173;&#20026;&#24050;&#20998;&#37197;</span>
longjmp<span class="br0">(</span>buf, <span class="nu0">2</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#21487;&#33021;&#22240;&#20026; h &#30340; b &#21644; g &#30340; a &#23548;&#33268;&#20869;&#23384;&#27844;&#28431;</span>
<span class="br0">}</span></pre></div>
</div>
</td>
<td><span class="t-mark-rev t-since-c99">(C99 &#36215;)</span></td>
</tr>
</table>
<h3><span class="mw-headline" id=".E5.8F.82.E6.95.B0">&#21442;&#25968;</span></h3>
<table class="t-par-begin">
<tr class="t-par">
<td>env</td>
<td>-</td>
<td>&#24341;&#29992; <span class="t-lc"><a href="c-program-setjmp.html">setjmp</a></span> &#25152;&#20445;&#23384;&#30340;&#31243;&#24207;&#25191;&#34892;&#29366;&#24577;&#30340;&#21464;&#37327;</td>
</tr>
<tr class="t-par">
<td>status</td>
<td>-</td>
<td>&#35201;&#20174; <span class="t-lc"><a href="c-program-setjmp.html">setjmp</a></span> &#36820;&#22238;&#30340;&#20540;&#12290;&#33509;&#23427;&#31561;&#20110; <span class="t-c"><span class="mw-geshi c source-c">&#8203;<span class="nu0">0</span>&#8203;</span></span> &#65292;&#21017;&#20197; <span class="t-c"><span class="mw-geshi c source-c"><span class="nu0">1</span></span></span> &#26367;&#20195;&#20351;&#29992;</td>
</tr>
</table>
<h3><span class="mw-headline" id=".E8.BF.94.E5.9B.9E.E5.80.BC">&#36820;&#22238;&#20540;</span></h3>
<p>&#65288;&#26080;&#65289;</p>
<h3><span class="mw-headline" id=".E6.B3.A8.E6.84.8F">&#27880;&#24847;</span></h3>
<p><code>longjmp</code> &#26159;&#26377;&#24847;&#29992;&#20197;&#22788;&#29702;&#26410;&#26399;&#24453;&#30340;&#38169;&#35823;&#26465;&#20214;&#30340;&#65292;&#35813;&#26465;&#20214;&#19979;&#20989;&#25968;&#26080;&#27861;&#26377;&#24847;&#20041;&#22320;&#36820;&#22238;&#12290;&#36825;&#19982;&#20854;&#20182;&#32534;&#31243;&#35821;&#35328;&#20013;&#30340;&#24322;&#24120;&#22788;&#29702;&#30456;&#20284;&#12290;</p>
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">&#31034;&#20363;</span></h3>
<div class="t-example">
<div class="t-example-live-link"></div>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="c source-c">
<pre class="de1"><span class="co2">#include &lt;stdio.h&gt;</span>
<span class="co2">#include &lt;setjmp.h&gt;</span>
<span class="co2">#include &lt;stdnoreturn.h&gt;</span>
<a href="c-program-jmp_buf.html"><span class="kw510">jmp_buf</span></a> jump_buffer<span class="sy4">;</span>
noreturn <span class="kw4">void</span> a<span class="br0">(</span><span class="kw4">int</span> count<span class="br0">)</span>
<span class="br0">{</span>
<a href="c-io-fprintf.html"><span class="kw850">printf</span></a><span class="br0">(</span><span class="st0">&quot;a(%d) called<span class="es1">\n</span>&quot;</span>, count<span class="br0">)</span><span class="sy4">;</span>
longjmp<span class="br0">(</span>jump_buffer, count<span class="sy2">+</span><span class="nu0">1</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// &#23558;&#22312; setjmp &#22806;&#36820;&#22238; count+1</span>
<span class="br0">}</span>
<span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>
<span class="br0">{</span>
<span class="kw4">volatile</span> <span class="kw4">int</span> count <span class="sy1">=</span> <span class="nu0">0</span><span class="sy4">;</span> <span class="co1">// &#24517;&#39035;&#20026; setjmp &#22768;&#26126; volatile &#23545;&#35937;</span>
<span class="kw1">if</span> <span class="br0">(</span><a href="c-program-setjmp.html"><span class="kw509">setjmp</span></a><span class="br0">(</span>jump_buffer<span class="br0">)</span> <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">9</span><span class="br0">)</span>
a<span class="br0">(</span>count<span class="sy2">++</span><span class="br0">)</span><span class="sy4">;</span>
<span class="br0">}</span></pre></div>
</div>
<p>&#36755;&#20986;&#65306;</p>
<div dir="ltr" class="mw-geshi" style="text-align: left;">
<div class="text source-text">
<pre class="de1">a(0) called
a(1) called
a(2) called
a(3) called
a(4) called
a(5) called
a(6) called
a(7) called
a(8) called</pre></div>
</div>
</div>
<h3><span class="mw-headline" id=".E5.BC.95.E7.94.A8">&#24341;&#29992;</span></h3>
<div class="t-ref-std-11">
<ul>
<li>C11 &#26631;&#20934;&#65288;ISO/IEC 9899:2011&#65289;&#65306;</li>
</ul>
<dl>
<dd>
<ul>
<li>7.13.2.1 The longjmp macro (p: 263-264)</li>
</ul>
</dd>
</dl>
<div class="t-ref-std-c99">
<ul>
<li>C99 &#26631;&#20934;&#65288;ISO/IEC 9899:1999&#65289;&#65306;</li>
</ul>
<dl>
<dd>
<ul>
<li>7.13.2.1 The longjmp macro (p: 244-245)</li>
</ul>
</dd>
</dl>
<div class="t-ref-std-c89">
<ul>
<li>C89/C90 &#26631;&#20934;&#65288;ISO/IEC 9899:1990&#65289;&#65306;</li>
</ul>
<dl>
<dd>
<ul>
<li>4.6.2.1 The longjmp function</li>
</ul>
</dd>
</dl>
</div>
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">&#21442;&#38405;</span></h3>
<table class="t-dsc-begin">
<tr class="t-dsc">
<td>
<div class="t-dsc-member-div">
<div><a href="c-program-setjmp.html"><span class="t-lines"><span>setjmp</span></span></a></div>
</div>
</td>
<td>&#20445;&#23384;&#29615;&#22659;<br />
<span class="t-mark">(&#23439;&#20989;&#25968;)</span></td>
</tr>
</table>
</div>
</div>
</div>
<div class="visualClear"></div>
</div>
</div>
</div>
</body>
</html>