⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 labels-as-values.html

📁 自己收集的linux入门到学懂高级编程书集 包括linux程序设计第三版
💻 HTML
字号:
<html lang="en"><head><title>Using the GNU Compiler Collection (GCC)</title><meta http-equiv="Content-Type" content="text/html"><meta name="description" content="Using the GNU Compiler Collection (GCC)"><meta name="generator" content="makeinfo 4.6"><!--Copyright &copy; 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.   <p>Permission is granted to copy, distribute and/or modify this documentunder the terms of the GNU Free Documentation License, Version 1.2 orany later version published by the Free Software Foundation; with theInvariant Sections being "GNU General Public License" and "FundingFree Software", the Front-Cover texts being (a) (see below), and withthe Back-Cover Texts being (b) (see below).  A copy of the license isincluded in the section entitled "GNU Free Documentation License".   <p>(a) The FSF's Front-Cover Text is:   <p>A GNU Manual   <p>(b) The FSF's Back-Cover Text is:   <p>You have freedom to copy and modify this GNU Manual, like GNU     software.  Copies published by the Free Software Foundation raise     funds for GNU development.--><meta http-equiv="Content-Style-Type" content="text/css"><style type="text/css"><!--  pre.display { font-family:inherit }  pre.format  { font-family:inherit }  pre.smalldisplay { font-family:inherit; font-size:smaller }  pre.smallformat  { font-family:inherit; font-size:smaller }  pre.smallexample { font-size:smaller }  pre.smalllisp    { font-size:smaller }--></style></head><body><div class="node"><p>Node:&nbsp;<a name="Labels%20as%20Values">Labels as Values</a>,Next:&nbsp;<a rel="next" accesskey="n" href="Nested-Functions.html#Nested%20Functions">Nested Functions</a>,Previous:&nbsp;<a rel="previous" accesskey="p" href="Local-Labels.html#Local%20Labels">Local Labels</a>,Up:&nbsp;<a rel="up" accesskey="u" href="C-Extensions.html#C%20Extensions">C Extensions</a><hr><br></div><h3 class="section">Labels as Values</h3><p>You can get the address of a label defined in the current function(or a containing function) with the unary operator <code>&amp;&amp;</code>.  Thevalue has type <code>void *</code>.  This value is a constant and can be usedwherever a constant of that type is valid.  For example:<pre class="smallexample">     void *ptr;     /* <small class="dots">...</small> */     ptr = &amp;&amp;foo;     </pre>   <p>To use these values, you need to be able to jump to one.  This is donewith the computed goto statement<a rel="footnote" href="#fn-1"><sup>1</sup></a>, <code>goto *</code><var>exp</var><code>;</code>.  For example,<pre class="smallexample">     goto *ptr;     </pre><p>Any expression of type <code>void *</code> is allowed.   <p>One way of using these constants is in initializing a static array thatwill serve as a jump table:<pre class="smallexample">     static void *array[] = { &amp;&amp;foo, &amp;&amp;bar, &amp;&amp;hack };     </pre>   <p>Then you can select a label with indexing, like this:<pre class="smallexample">     goto *array[i];     </pre><p>Note that this does not check whether the subscript is in bounds--arrayindexing in C never does that.   <p>Such an array of label values serves a purpose much like that of the<code>switch</code> statement.  The <code>switch</code> statement is cleaner, souse that rather than an array unless the problem does not fit a<code>switch</code> statement very well.   <p>Another use of label values is in an interpreter for threaded code. The labels within the interpreter function can be stored in thethreaded code for super-fast dispatching.   <p>You may not use this mechanism to jump to code in a different function. If you do that, totally unpredictable things will happen.  The best way toavoid this is to store the label address only in automatic variables andnever pass it as an argument.   <p>An alternate way to write the above example is<pre class="smallexample">     static const int array[] = { &amp;&amp;foo - &amp;&amp;foo, &amp;&amp;bar - &amp;&amp;foo,                                  &amp;&amp;hack - &amp;&amp;foo };     goto *(&amp;&amp;foo + array[i]);     </pre><p>This is more friendly to code living in shared libraries, as it reducesthe number of dynamic relocations that are needed, and by consequence,allows the data to be read-only.   <div class="footnote"><hr><h4>Footnotes</h4><ol type="1"><li><a name="fn-1"></a><p>The analogous feature inFortran is called an assigned goto, but that name seems inappropriate inC, where one can do more than simply store label addresses in labelvariables.</p>   </ol><hr></div>   </body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -