1<html lang="en"> 2<head> 3<title>Labels as Values - Using the GNU Compiler Collection (GCC)</title> 4<meta http-equiv="Content-Type" content="text/html"> 5<meta name="description" content="Using the GNU Compiler Collection (GCC)"> 6<meta name="generator" content="makeinfo 4.13"> 7<link title="Top" rel="start" href="index.html#Top"> 8<link rel="up" href="C-Extensions.html#C-Extensions" title="C Extensions"> 9<link rel="prev" href="Local-Labels.html#Local-Labels" title="Local Labels"> 10<link rel="next" href="Nested-Functions.html#Nested-Functions" title="Nested Functions"> 11<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> 12<!-- 13Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 141998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 152010 Free Software Foundation, Inc. 16 17Permission is granted to copy, distribute and/or modify this document 18under the terms of the GNU Free Documentation License, Version 1.3 or 19any later version published by the Free Software Foundation; with the 20Invariant Sections being ``Funding Free Software'', the Front-Cover 21Texts being (a) (see below), and with the Back-Cover Texts being (b) 22(see below). A copy of the license is included in the section entitled 23``GNU Free Documentation License''. 24 25(a) The FSF's Front-Cover Text is: 26 27 A GNU Manual 28 29(b) The FSF's Back-Cover Text is: 30 31 You have freedom to copy and modify this GNU Manual, like GNU 32 software. Copies published by the Free Software Foundation raise 33 funds for GNU development.--> 34<meta http-equiv="Content-Style-Type" content="text/css"> 35<style type="text/css"><!-- 36 pre.display { font-family:inherit } 37 pre.format { font-family:inherit } 38 pre.smalldisplay { font-family:inherit; font-size:smaller } 39 pre.smallformat { font-family:inherit; font-size:smaller } 40 pre.smallexample { font-size:smaller } 41 pre.smalllisp { font-size:smaller } 42 span.sc { font-variant:small-caps } 43 span.roman { font-family:serif; font-weight:normal; } 44 span.sansserif { font-family:sans-serif; font-weight:normal; } 45--></style> 46<link rel="stylesheet" type="text/css" href="../cs.css"> 47</head> 48<body> 49<div class="node"> 50<a name="Labels-as-Values"></a> 51<p> 52Next: <a rel="next" accesskey="n" href="Nested-Functions.html#Nested-Functions">Nested Functions</a>, 53Previous: <a rel="previous" accesskey="p" href="Local-Labels.html#Local-Labels">Local Labels</a>, 54Up: <a rel="up" accesskey="u" href="C-Extensions.html#C-Extensions">C Extensions</a> 55<hr> 56</div> 57 58<h3 class="section">6.3 Labels as Values</h3> 59 60<p><a name="index-labels-as-values-2246"></a><a name="index-computed-gotos-2247"></a><a name="index-goto-with-computed-label-2248"></a><a name="index-address-of-a-label-2249"></a> 61You can get the address of a label defined in the current function 62(or a containing function) with the unary operator ‘<samp><span class="samp">&&</span></samp>’. The 63value has type <code>void *</code>. This value is a constant and can be used 64wherever a constant of that type is valid. For example: 65 66<pre class="smallexample"> void *ptr; 67 /* <span class="roman">...</span> */ 68 ptr = &&foo; 69</pre> 70 <p>To use these values, you need to be able to jump to one. This is done 71with the computed goto statement<a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a>, <code>goto *</code><var>exp</var><code>;</code>. For example, 72 73<pre class="smallexample"> goto *ptr; 74</pre> 75 <p class="noindent">Any expression of type <code>void *</code> is allowed. 76 77 <p>One way of using these constants is in initializing a static array that 78will serve as a jump table: 79 80<pre class="smallexample"> static void *array[] = { &&foo, &&bar, &&hack }; 81</pre> 82 <p>Then you can select a label with indexing, like this: 83 84<pre class="smallexample"> goto *array[i]; 85</pre> 86 <p class="noindent">Note that this does not check whether the subscript is in bounds—array 87indexing in C never does that. 88 89 <p>Such an array of label values serves a purpose much like that of the 90<code>switch</code> statement. The <code>switch</code> statement is cleaner, so 91use that rather than an array unless the problem does not fit a 92<code>switch</code> statement very well. 93 94 <p>Another use of label values is in an interpreter for threaded code. 95The labels within the interpreter function can be stored in the 96threaded code for super-fast dispatching. 97 98 <p>You may not use this mechanism to jump to code in a different function. 99If you do that, totally unpredictable things will happen. The best way to 100avoid this is to store the label address only in automatic variables and 101never pass it as an argument. 102 103 <p>An alternate way to write the above example is 104 105<pre class="smallexample"> static const int array[] = { &&foo - &&foo, &&bar - &&foo, 106 &&hack - &&foo }; 107 goto *(&&foo + array[i]); 108</pre> 109 <p class="noindent">This is more friendly to code living in shared libraries, as it reduces 110the number of dynamic relocations that are needed, and by consequence, 111allows the data to be read-only. 112 113 <p>The <code>&&foo</code> expressions for the same label might have different 114values if the containing function is inlined or cloned. If a program 115relies on them being always the same, 116<code>__attribute__((__noinline__,__noclone__))</code> should be used to 117prevent inlining and cloning. If <code>&&foo</code> is used in a static 118variable initializer, inlining and cloning is forbidden. 119 120 <div class="footnote"> 121<hr> 122<h4>Footnotes</h4><p class="footnote"><small>[<a name="fn-1" href="#fnd-1">1</a>]</small> The analogous feature in 123Fortran is called an assigned goto, but that name seems inappropriate in 124C, where one can do more than simply store label addresses in label 125variables.</p> 126 127 <hr></div> 128 129 </body></html> 130 131