blob: 54ac4835bbdb1f4b4cbea35d3a9dd34b6f5bc2c4 [file] [log] [blame]
<html lang="en">
<head>
<title>Typeof - 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.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="C-Extensions.html#C-Extensions" title="C Extensions">
<link rel="prev" href="Constructing-Calls.html#Constructing-Calls" title="Constructing Calls">
<link rel="next" href="Conditionals.html#Conditionals" title="Conditionals">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
2008 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Funding Free Software'', the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below). A copy of the license is included in the section entitled
``GNU Free Documentation License''.
(a) The FSF's Front-Cover Text is:
A GNU Manual
(b) The FSF's Back-Cover Text is:
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 }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Typeof"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Conditionals.html#Conditionals">Conditionals</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Constructing-Calls.html#Constructing-Calls">Constructing Calls</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="C-Extensions.html#C-Extensions">C Extensions</a>
<hr>
</div>
<h3 class="section">6.6 Referring to a Type with <code>typeof</code></h3>
<p><a name="index-typeof-2201"></a><a name="index-sizeof-2202"></a><a name="index-macros_002c-types-of-arguments-2203"></a>
Another way to refer to the type of an expression is with <code>typeof</code>.
The syntax of using of this keyword looks like <code>sizeof</code>, but the
construct acts semantically like a type name defined with <code>typedef</code>.
<p>There are two ways of writing the argument to <code>typeof</code>: with an
expression or with a type. Here is an example with an expression:
<pre class="smallexample"> typeof (x[0](1))
</pre>
<p class="noindent">This assumes that <code>x</code> is an array of pointers to functions;
the type described is that of the values of the functions.
<p>Here is an example with a typename as the argument:
<pre class="smallexample"> typeof (int *)
</pre>
<p class="noindent">Here the type described is that of pointers to <code>int</code>.
<p>If you are writing a header file that must work when included in ISO C
programs, write <code>__typeof__</code> instead of <code>typeof</code>.
See <a href="Alternate-Keywords.html#Alternate-Keywords">Alternate Keywords</a>.
<p>A <code>typeof</code>-construct can be used anywhere a typedef name could be
used. For example, you can use it in a declaration, in a cast, or inside
of <code>sizeof</code> or <code>typeof</code>.
<p>The operand of <code>typeof</code> is evaluated for its side effects if and
only if it is an expression of variably modified type or the name of
such a type.
<p><code>typeof</code> is often useful in conjunction with the
statements-within-expressions feature. Here is how the two together can
be used to define a safe &ldquo;maximum&rdquo; macro that operates on any
arithmetic type and evaluates each of its arguments exactly once:
<pre class="smallexample"> #define max(a,b) \
({ typeof (a) _a = (a); \
typeof (b) _b = (b); \
_a &gt; _b ? _a : _b; })
</pre>
<p><a name="index-underscores-in-variables-in-macros-2204"></a><a name="index-g_t_0040samp_007b_005f_007d-in-variables-in-macros-2205"></a><a name="index-local-variables-in-macros-2206"></a><a name="index-variables_002c-local_002c-in-macros-2207"></a><a name="index-macros_002c-local-variables-in-2208"></a>
The reason for using names that start with underscores for the local
variables is to avoid conflicts with variable names that occur within the
expressions that are substituted for <code>a</code> and <code>b</code>. Eventually we
hope to design a new form of declaration syntax that allows you to declare
variables whose scopes start only after their initializers; this will be a
more reliable way to prevent such conflicts.
<p class="noindent">Some more examples of the use of <code>typeof</code>:
<ul>
<li>This declares <code>y</code> with the type of what <code>x</code> points to.
<pre class="smallexample"> typeof (*x) y;
</pre>
<li>This declares <code>y</code> as an array of such values.
<pre class="smallexample"> typeof (*x) y[4];
</pre>
<li>This declares <code>y</code> as an array of pointers to characters:
<pre class="smallexample"> typeof (typeof (char *)[4]) y;
</pre>
<p class="noindent">It is equivalent to the following traditional C declaration:
<pre class="smallexample"> char *y[4];
</pre>
<p>To see the meaning of the declaration using <code>typeof</code>, and why it
might be a useful way to write, rewrite it with these macros:
<pre class="smallexample"> #define pointer(T) typeof(T *)
#define array(T, N) typeof(T [N])
</pre>
<p class="noindent">Now the declaration can be rewritten this way:
<pre class="smallexample"> array (pointer (char), 4) y;
</pre>
<p class="noindent">Thus, <code>array (pointer (char), 4)</code> is the type of arrays of 4
pointers to <code>char</code>.
</ul>
<p><em>Compatibility Note:</em> In addition to <code>typeof</code>, GCC 2 supported
a more limited extension which permitted one to write
<pre class="smallexample"> typedef <var>T</var> = <var>expr</var>;
</pre>
<p class="noindent">with the effect of declaring <var>T</var> to have the type of the expression
<var>expr</var>. This extension does not work with GCC 3 (versions between
3.0 and 3.2 will crash; 3.2.1 and later give an error). Code which
relies on it should be rewritten to use <code>typeof</code>:
<pre class="smallexample"> typedef typeof(<var>expr</var>) <var>T</var>;
</pre>
<p class="noindent">This will work with all versions of GCC.
</body></html>