mirror of
https://github.com/esp8266/Arduino.git
synced 2025-10-21 08:47:48 +03:00
Adding CodeSourcery just in case of, to be removed later
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Alternatives to Wrapper #ifndef - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Header-Files.html#Header-Files" title="Header Files">
|
||||
<link rel="prev" href="Once_002dOnly-Headers.html#Once_002dOnly-Headers" title="Once-Only Headers">
|
||||
<link rel="next" href="Computed-Includes.html#Computed-Includes" title="Computed Includes">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Alternatives-to-Wrapper-%23ifndef"></a>
|
||||
<a name="Alternatives-to-Wrapper-_0023ifndef"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Computed-Includes.html#Computed-Includes">Computed Includes</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Once_002dOnly-Headers.html#Once_002dOnly-Headers">Once-Only Headers</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Header-Files.html#Header-Files">Header Files</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">2.5 Alternatives to Wrapper #ifndef</h3>
|
||||
|
||||
<p>CPP supports two more ways of indicating that a header file should be
|
||||
read only once. Neither one is as portable as a wrapper ‘<samp><span class="samp">#ifndef</span></samp>’
|
||||
and we recommend you do not use them in new programs, with the caveat
|
||||
that ‘<samp><span class="samp">#import</span></samp>’ is standard practice in Objective-C.
|
||||
|
||||
<p><a name="index-g_t_0023import-33"></a>CPP supports a variant of ‘<samp><span class="samp">#include</span></samp>’ called ‘<samp><span class="samp">#import</span></samp>’ which
|
||||
includes a file, but does so at most once. If you use ‘<samp><span class="samp">#import</span></samp>’
|
||||
instead of ‘<samp><span class="samp">#include</span></samp>’, then you don't need the conditionals
|
||||
inside the header file to prevent multiple inclusion of the contents.
|
||||
‘<samp><span class="samp">#import</span></samp>’ is standard in Objective-C, but is considered a
|
||||
deprecated extension in C and C++.
|
||||
|
||||
<p>‘<samp><span class="samp">#import</span></samp>’ is not a well designed feature. It requires the users of
|
||||
a header file to know that it should only be included once. It is much
|
||||
better for the header file's implementor to write the file so that users
|
||||
don't need to know this. Using a wrapper ‘<samp><span class="samp">#ifndef</span></samp>’ accomplishes
|
||||
this goal.
|
||||
|
||||
<p>In the present implementation, a single use of ‘<samp><span class="samp">#import</span></samp>’ will
|
||||
prevent the file from ever being read again, by either ‘<samp><span class="samp">#import</span></samp>’ or
|
||||
‘<samp><span class="samp">#include</span></samp>’. You should not rely on this; do not use both
|
||||
‘<samp><span class="samp">#import</span></samp>’ and ‘<samp><span class="samp">#include</span></samp>’ to refer to the same header file.
|
||||
|
||||
<p>Another way to prevent a header file from being included more than once
|
||||
is with the ‘<samp><span class="samp">#pragma once</span></samp>’ directive. If ‘<samp><span class="samp">#pragma once</span></samp>’ is
|
||||
seen when scanning a header file, that file will never be read again, no
|
||||
matter what.
|
||||
|
||||
<p>‘<samp><span class="samp">#pragma once</span></samp>’ does not have the problems that ‘<samp><span class="samp">#import</span></samp>’ does,
|
||||
but it is not recognized by all preprocessors, so you cannot rely on it
|
||||
in a portable program.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,146 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Argument Prescan - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macro-Pitfalls.html#Macro-Pitfalls" title="Macro Pitfalls">
|
||||
<link rel="prev" href="Self_002dReferential-Macros.html#Self_002dReferential-Macros" title="Self-Referential Macros">
|
||||
<link rel="next" href="Newlines-in-Arguments.html#Newlines-in-Arguments" title="Newlines in Arguments">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Argument-Prescan"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Newlines-in-Arguments.html#Newlines-in-Arguments">Newlines in Arguments</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Self_002dReferential-Macros.html#Self_002dReferential-Macros">Self-Referential Macros</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macro-Pitfalls.html#Macro-Pitfalls">Macro Pitfalls</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h4 class="subsection">3.10.6 Argument Prescan</h4>
|
||||
|
||||
<p><a name="index-expansion-of-arguments-79"></a><a name="index-macro-argument-expansion-80"></a><a name="index-prescan-of-macro-arguments-81"></a>
|
||||
Macro arguments are completely macro-expanded before they are
|
||||
substituted into a macro body, unless they are stringified or pasted
|
||||
with other tokens. After substitution, the entire macro body, including
|
||||
the substituted arguments, is scanned again for macros to be expanded.
|
||||
The result is that the arguments are scanned <em>twice</em> to expand
|
||||
macro calls in them.
|
||||
|
||||
<p>Most of the time, this has no effect. If the argument contained any
|
||||
macro calls, they are expanded during the first scan. The result
|
||||
therefore contains no macro calls, so the second scan does not change
|
||||
it. If the argument were substituted as given, with no prescan, the
|
||||
single remaining scan would find the same macro calls and produce the
|
||||
same results.
|
||||
|
||||
<p>You might expect the double scan to change the results when a
|
||||
self-referential macro is used in an argument of another macro
|
||||
(see <a href="Self_002dReferential-Macros.html#Self_002dReferential-Macros">Self-Referential Macros</a>): the self-referential macro would be
|
||||
expanded once in the first scan, and a second time in the second scan.
|
||||
However, this is not what happens. The self-references that do not
|
||||
expand in the first scan are marked so that they will not expand in the
|
||||
second scan either.
|
||||
|
||||
<p>You might wonder, “Why mention the prescan, if it makes no difference?
|
||||
And why not skip it and make the preprocessor faster?” The answer is
|
||||
that the prescan does make a difference in three special cases:
|
||||
|
||||
<ul>
|
||||
<li>Nested calls to a macro.
|
||||
|
||||
<p>We say that <dfn>nested</dfn> calls to a macro occur when a macro's argument
|
||||
contains a call to that very macro. For example, if <code>f</code> is a macro
|
||||
that expects one argument, <code>f (f (1))</code> is a nested pair of calls to
|
||||
<code>f</code>. The desired expansion is made by expanding <code>f (1)</code> and
|
||||
substituting that into the definition of <code>f</code>. The prescan causes
|
||||
the expected result to happen. Without the prescan, <code>f (1)</code> itself
|
||||
would be substituted as an argument, and the inner use of <code>f</code> would
|
||||
appear during the main scan as an indirect self-reference and would not
|
||||
be expanded.
|
||||
|
||||
<li>Macros that call other macros that stringify or concatenate.
|
||||
|
||||
<p>If an argument is stringified or concatenated, the prescan does not
|
||||
occur. If you <em>want</em> to expand a macro, then stringify or
|
||||
concatenate its expansion, you can do that by causing one macro to call
|
||||
another macro that does the stringification or concatenation. For
|
||||
instance, if you have
|
||||
|
||||
<pre class="smallexample"> #define AFTERX(x) X_ ## x
|
||||
#define XAFTERX(x) AFTERX(x)
|
||||
#define TABLESIZE 1024
|
||||
#define BUFSIZE TABLESIZE
|
||||
</pre>
|
||||
<p>then <code>AFTERX(BUFSIZE)</code> expands to <code>X_BUFSIZE</code>, and
|
||||
<code>XAFTERX(BUFSIZE)</code> expands to <code>X_1024</code>. (Not to
|
||||
<code>X_TABLESIZE</code>. Prescan always does a complete expansion.)
|
||||
|
||||
<li>Macros used in arguments, whose expansions contain unshielded commas.
|
||||
|
||||
<p>This can cause a macro expanded on the second scan to be called with the
|
||||
wrong number of arguments. Here is an example:
|
||||
|
||||
<pre class="smallexample"> #define foo a,b
|
||||
#define bar(x) lose(x)
|
||||
#define lose(x) (1 + (x))
|
||||
</pre>
|
||||
<p>We would like <code>bar(foo)</code> to turn into <code>(1 + (foo))</code>, which
|
||||
would then turn into <code>(1 + (a,b))</code>. Instead, <code>bar(foo)</code>
|
||||
expands into <code>lose(a,b)</code>, and you get an error because <code>lose</code>
|
||||
requires a single argument. In this case, the problem is easily solved
|
||||
by the same parentheses that ought to be used to prevent misnesting of
|
||||
arithmetic operations:
|
||||
|
||||
<pre class="smallexample"> #define foo (a,b)
|
||||
<br>or<br>
|
||||
#define bar(x) lose((x))
|
||||
</pre>
|
||||
<p>The extra pair of parentheses prevents the comma in <code>foo</code>'s
|
||||
definition from being interpreted as an argument separator.
|
||||
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,88 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>C++ Named Operators - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Predefined-Macros.html#Predefined-Macros" title="Predefined Macros">
|
||||
<link rel="prev" href="System_002dspecific-Predefined-Macros.html#System_002dspecific-Predefined-Macros" title="System-specific Predefined Macros">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="C++-Named-Operators"></a>
|
||||
<a name="C_002b_002b-Named-Operators"></a>
|
||||
<p>
|
||||
Previous: <a rel="previous" accesskey="p" href="System_002dspecific-Predefined-Macros.html#System_002dspecific-Predefined-Macros">System-specific Predefined Macros</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Predefined-Macros.html#Predefined-Macros">Predefined Macros</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h4 class="subsection">3.7.4 C++ Named Operators</h4>
|
||||
|
||||
<p><a name="index-named-operators-65"></a><a name="index-C_002b_002b-named-operators-66"></a><a name="index-iso646_002eh-67"></a>
|
||||
In C++, there are eleven keywords which are simply alternate spellings
|
||||
of operators normally written with punctuation. These keywords are
|
||||
treated as such even in the preprocessor. They function as operators in
|
||||
‘<samp><span class="samp">#if</span></samp>’, and they cannot be defined as macros or poisoned. In C, you
|
||||
can request that those keywords take their C++ meaning by including
|
||||
<samp><span class="file">iso646.h</span></samp>. That header defines each one as a normal object-like
|
||||
macro expanding to the appropriate punctuator.
|
||||
|
||||
<p>These are the named operators and their corresponding punctuators:
|
||||
|
||||
<p><table summary=""><tr align="left"><td valign="top">Named Operator </td><td valign="top">Punctuator
|
||||
<br></td></tr><tr align="left"><td valign="top"><code>and</code> </td><td valign="top"><code>&&</code>
|
||||
<br></td></tr><tr align="left"><td valign="top"><code>and_eq</code> </td><td valign="top"><code>&=</code>
|
||||
<br></td></tr><tr align="left"><td valign="top"><code>bitand</code> </td><td valign="top"><code>&</code>
|
||||
<br></td></tr><tr align="left"><td valign="top"><code>bitor</code> </td><td valign="top"><code>|</code>
|
||||
<br></td></tr><tr align="left"><td valign="top"><code>compl</code> </td><td valign="top"><code>~</code>
|
||||
<br></td></tr><tr align="left"><td valign="top"><code>not</code> </td><td valign="top"><code>!</code>
|
||||
<br></td></tr><tr align="left"><td valign="top"><code>not_eq</code> </td><td valign="top"><code>!=</code>
|
||||
<br></td></tr><tr align="left"><td valign="top"><code>or</code> </td><td valign="top"><code>||</code>
|
||||
<br></td></tr><tr align="left"><td valign="top"><code>or_eq</code> </td><td valign="top"><code>|=</code>
|
||||
<br></td></tr><tr align="left"><td valign="top"><code>xor</code> </td><td valign="top"><code>^</code>
|
||||
<br></td></tr><tr align="left"><td valign="top"><code>xor_eq</code> </td><td valign="top"><code>^=</code>
|
||||
<br></td></tr></table>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,111 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Character sets - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Overview.html#Overview" title="Overview">
|
||||
<link rel="next" href="Initial-processing.html#Initial-processing" title="Initial processing">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Character-sets"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Initial-processing.html#Initial-processing">Initial processing</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Overview.html#Overview">Overview</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">1.1 Character sets</h3>
|
||||
|
||||
<p>Source code character set processing in C and related languages is
|
||||
rather complicated. The C standard discusses two character sets, but
|
||||
there are really at least four.
|
||||
|
||||
<p>The files input to CPP might be in any character set at all. CPP's
|
||||
very first action, before it even looks for line boundaries, is to
|
||||
convert the file into the character set it uses for internal
|
||||
processing. That set is what the C standard calls the <dfn>source</dfn>
|
||||
character set. It must be isomorphic with ISO 10646, also known as
|
||||
Unicode. CPP uses the UTF-8 encoding of Unicode.
|
||||
|
||||
<p>The character sets of the input files are specified using the
|
||||
<samp><span class="option">-finput-charset=</span></samp> option.
|
||||
|
||||
<p>All preprocessing work (the subject of the rest of this manual) is
|
||||
carried out in the source character set. If you request textual
|
||||
output from the preprocessor with the <samp><span class="option">-E</span></samp> option, it will be
|
||||
in UTF-8.
|
||||
|
||||
<p>After preprocessing is complete, string and character constants are
|
||||
converted again, into the <dfn>execution</dfn> character set. This
|
||||
character set is under control of the user; the default is UTF-8,
|
||||
matching the source character set. Wide string and character
|
||||
constants have their own character set, which is not called out
|
||||
specifically in the standard. Again, it is under control of the user.
|
||||
The default is UTF-16 or UTF-32, whichever fits in the target's
|
||||
<code>wchar_t</code> type, in the target machine's byte
|
||||
order.<a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a> Octal and hexadecimal escape sequences do not undergo
|
||||
conversion; <tt>'\x12'</tt> has the value 0x12 regardless of the currently
|
||||
selected execution character set. All other escapes are replaced by
|
||||
the character in the source character set that they represent, then
|
||||
converted to the execution character set, just like unescaped
|
||||
characters.
|
||||
|
||||
<p>Unless the experimental <samp><span class="option">-fextended-identifiers</span></samp> option is used,
|
||||
GCC does not permit the use of characters outside the ASCII range, nor
|
||||
‘<samp><span class="samp">\u</span></samp>’ and ‘<samp><span class="samp">\U</span></samp>’ escapes, in identifiers. Even with that
|
||||
option, characters outside the ASCII range can only be specified with
|
||||
the ‘<samp><span class="samp">\u</span></samp>’ and ‘<samp><span class="samp">\U</span></samp>’ escapes, not used directly in identifiers.
|
||||
|
||||
<div class="footnote">
|
||||
<hr>
|
||||
<h4>Footnotes</h4><p class="footnote"><small>[<a name="fn-1" href="#fnd-1">1</a>]</small> UTF-16 does not meet the requirements of the C
|
||||
standard for a wide character set, but the choice of 16-bit
|
||||
<code>wchar_t</code> is enshrined in some system ABIs so we cannot fix
|
||||
this.</p>
|
||||
|
||||
<hr></div>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,321 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Common Predefined Macros - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Predefined-Macros.html#Predefined-Macros" title="Predefined Macros">
|
||||
<link rel="prev" href="Standard-Predefined-Macros.html#Standard-Predefined-Macros" title="Standard Predefined Macros">
|
||||
<link rel="next" href="System_002dspecific-Predefined-Macros.html#System_002dspecific-Predefined-Macros" title="System-specific Predefined Macros">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Common-Predefined-Macros"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="System_002dspecific-Predefined-Macros.html#System_002dspecific-Predefined-Macros">System-specific Predefined Macros</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Standard-Predefined-Macros.html#Standard-Predefined-Macros">Standard Predefined Macros</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Predefined-Macros.html#Predefined-Macros">Predefined Macros</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h4 class="subsection">3.7.2 Common Predefined Macros</h4>
|
||||
|
||||
<p><a name="index-common-predefined-macros-61"></a>
|
||||
The common predefined macros are GNU C extensions. They are available
|
||||
with the same meanings regardless of the machine or operating system on
|
||||
which you are using GNU C or GNU Fortran. Their names all start with
|
||||
double underscores.
|
||||
|
||||
<dl>
|
||||
<dt><code>__COUNTER__</code><dd>This macro expands to sequential integral values starting from 0. In
|
||||
conjunction with the <code>##</code> operator, this provides a convenient means to
|
||||
generate unique identifiers. Care must be taken to ensure that
|
||||
<code>__COUNTER__</code> is not expanded prior to inclusion of precompiled headers
|
||||
which use it. Otherwise, the precompiled headers will not be used.
|
||||
|
||||
<br><dt><code>__GFORTRAN__</code><dd>The GNU Fortran compiler defines this.
|
||||
|
||||
<br><dt><code>__GNUC__</code><dt><code>__GNUC_MINOR__</code><dt><code>__GNUC_PATCHLEVEL__</code><dd>These macros are defined by all GNU compilers that use the C
|
||||
preprocessor: C, C++, Objective-C and Fortran. Their values are the major
|
||||
version, minor version, and patch level of the compiler, as integer
|
||||
constants. For example, GCC 3.2.1 will define <code>__GNUC__</code> to 3,
|
||||
<code>__GNUC_MINOR__</code> to 2, and <code>__GNUC_PATCHLEVEL__</code> to 1. These
|
||||
macros are also defined if you invoke the preprocessor directly.
|
||||
|
||||
<p><code>__GNUC_PATCHLEVEL__</code> is new to GCC 3.0; it is also present in the
|
||||
widely-used development snapshots leading up to 3.0 (which identify
|
||||
themselves as GCC 2.96 or 2.97, depending on which snapshot you have).
|
||||
|
||||
<p>If all you need to know is whether or not your program is being compiled
|
||||
by GCC, or a non-GCC compiler that claims to accept the GNU C dialects,
|
||||
you can simply test <code>__GNUC__</code>. If you need to write code
|
||||
which depends on a specific version, you must be more careful. Each
|
||||
time the minor version is increased, the patch level is reset to zero;
|
||||
each time the major version is increased (which happens rarely), the
|
||||
minor version and patch level are reset. If you wish to use the
|
||||
predefined macros directly in the conditional, you will need to write it
|
||||
like this:
|
||||
|
||||
<pre class="smallexample"> /* <span class="roman">Test for GCC > 3.2.0</span> */
|
||||
#if __GNUC__ > 3 || \
|
||||
(__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \
|
||||
(__GNUC_MINOR__ == 2 && \
|
||||
__GNUC_PATCHLEVEL__ > 0))
|
||||
</pre>
|
||||
<p class="noindent">Another approach is to use the predefined macros to
|
||||
calculate a single number, then compare that against a threshold:
|
||||
|
||||
<pre class="smallexample"> #define GCC_VERSION (__GNUC__ * 10000 \
|
||||
+ __GNUC_MINOR__ * 100 \
|
||||
+ __GNUC_PATCHLEVEL__)
|
||||
...
|
||||
/* <span class="roman">Test for GCC > 3.2.0</span> */
|
||||
#if GCC_VERSION > 30200
|
||||
</pre>
|
||||
<p class="noindent">Many people find this form easier to understand.
|
||||
|
||||
<br><dt><code>__GNUG__</code><dd>The GNU C++ compiler defines this. Testing it is equivalent to
|
||||
testing <code>(__GNUC__ && __cplusplus)<!-- /@w --></code>.
|
||||
|
||||
<br><dt><code>__STRICT_ANSI__</code><dd>GCC defines this macro if and only if the <samp><span class="option">-ansi</span></samp> switch, or a
|
||||
<samp><span class="option">-std</span></samp> switch specifying strict conformance to some version of ISO C,
|
||||
was specified when GCC was invoked. It is defined to ‘<samp><span class="samp">1</span></samp>’.
|
||||
This macro exists primarily to direct GNU libc's header files to
|
||||
restrict their definitions to the minimal set found in the 1989 C
|
||||
standard.
|
||||
|
||||
<br><dt><code>__BASE_FILE__</code><dd>This macro expands to the name of the main input file, in the form
|
||||
of a C string constant. This is the source file that was specified
|
||||
on the command line of the preprocessor or C compiler.
|
||||
|
||||
<br><dt><code>__INCLUDE_LEVEL__</code><dd>This macro expands to a decimal integer constant that represents the
|
||||
depth of nesting in include files. The value of this macro is
|
||||
incremented on every ‘<samp><span class="samp">#include</span></samp>’ directive and decremented at the
|
||||
end of every included file. It starts out at 0, its value within the
|
||||
base file specified on the command line.
|
||||
|
||||
<br><dt><code>__ELF__</code><dd>This macro is defined if the target uses the ELF object format.
|
||||
|
||||
<br><dt><code>__VERSION__</code><dd>This macro expands to a string constant which describes the version of
|
||||
the compiler in use. You should not rely on its contents having any
|
||||
particular form, but it can be counted on to contain at least the
|
||||
release number.
|
||||
|
||||
<br><dt><code>__OPTIMIZE__</code><dt><code>__OPTIMIZE_SIZE__</code><dt><code>__NO_INLINE__</code><dd>These macros describe the compilation mode. <code>__OPTIMIZE__</code> is
|
||||
defined in all optimizing compilations. <code>__OPTIMIZE_SIZE__</code> is
|
||||
defined if the compiler is optimizing for size, not speed.
|
||||
<code>__NO_INLINE__</code> is defined if no functions will be inlined into
|
||||
their callers (when not optimizing, or when inlining has been
|
||||
specifically disabled by <samp><span class="option">-fno-inline</span></samp>).
|
||||
|
||||
<p>These macros cause certain GNU header files to provide optimized
|
||||
definitions, using macros or inline functions, of system library
|
||||
functions. You should not use these macros in any way unless you make
|
||||
sure that programs will execute with the same effect whether or not they
|
||||
are defined. If they are defined, their value is 1.
|
||||
|
||||
<br><dt><code>__GNUC_GNU_INLINE__</code><dd>GCC defines this macro if functions declared <code>inline</code> will be
|
||||
handled in GCC's traditional gnu90 mode. Object files will contain
|
||||
externally visible definitions of all functions declared <code>inline</code>
|
||||
without <code>extern</code> or <code>static</code>. They will not contain any
|
||||
definitions of any functions declared <code>extern inline</code>.
|
||||
|
||||
<br><dt><code>__GNUC_STDC_INLINE__</code><dd>GCC defines this macro if functions declared <code>inline</code> will be
|
||||
handled according to the ISO C99 standard. Object files will contain
|
||||
externally visible definitions of all functions declared <code>extern
|
||||
inline</code>. They will not contain definitions of any functions declared
|
||||
<code>inline</code> without <code>extern</code>.
|
||||
|
||||
<p>If this macro is defined, GCC supports the <code>gnu_inline</code> function
|
||||
attribute as a way to always get the gnu90 behavior. Support for
|
||||
this and <code>__GNUC_GNU_INLINE__</code> was added in GCC 4.1.3. If
|
||||
neither macro is defined, an older version of GCC is being used:
|
||||
<code>inline</code> functions will be compiled in gnu90 mode, and the
|
||||
<code>gnu_inline</code> function attribute will not be recognized.
|
||||
|
||||
<br><dt><code>__CHAR_UNSIGNED__</code><dd>GCC defines this macro if and only if the data type <code>char</code> is
|
||||
unsigned on the target machine. It exists to cause the standard header
|
||||
file <samp><span class="file">limits.h</span></samp> to work correctly. You should not use this macro
|
||||
yourself; instead, refer to the standard macros defined in <samp><span class="file">limits.h</span></samp>.
|
||||
|
||||
<br><dt><code>__WCHAR_UNSIGNED__</code><dd>Like <code>__CHAR_UNSIGNED__</code>, this macro is defined if and only if the
|
||||
data type <code>wchar_t</code> is unsigned and the front-end is in C++ mode.
|
||||
|
||||
<br><dt><code>__REGISTER_PREFIX__</code><dd>This macro expands to a single token (not a string constant) which is
|
||||
the prefix applied to CPU register names in assembly language for this
|
||||
target. You can use it to write assembly that is usable in multiple
|
||||
environments. For example, in the <code>m68k-aout</code> environment it
|
||||
expands to nothing, but in the <code>m68k-coff</code> environment it expands
|
||||
to a single ‘<samp><span class="samp">%</span></samp>’.
|
||||
|
||||
<br><dt><code>__USER_LABEL_PREFIX__</code><dd>This macro expands to a single token which is the prefix applied to
|
||||
user labels (symbols visible to C code) in assembly. For example, in
|
||||
the <code>m68k-aout</code> environment it expands to an ‘<samp><span class="samp">_</span></samp>’, but in the
|
||||
<code>m68k-coff</code> environment it expands to nothing.
|
||||
|
||||
<p>This macro will have the correct definition even if
|
||||
<samp><span class="option">-f(no-)underscores</span></samp> is in use, but it will not be correct if
|
||||
target-specific options that adjust this prefix are used (e.g. the
|
||||
OSF/rose <samp><span class="option">-mno-underscores</span></samp> option).
|
||||
|
||||
<br><dt><code>__SIZE_TYPE__</code><dt><code>__PTRDIFF_TYPE__</code><dt><code>__WCHAR_TYPE__</code><dt><code>__WINT_TYPE__</code><dt><code>__INTMAX_TYPE__</code><dt><code>__UINTMAX_TYPE__</code><dt><code>__SIG_ATOMIC_TYPE__</code><dt><code>__INT8_TYPE__</code><dt><code>__INT16_TYPE__</code><dt><code>__INT32_TYPE__</code><dt><code>__INT64_TYPE__</code><dt><code>__UINT8_TYPE__</code><dt><code>__UINT16_TYPE__</code><dt><code>__UINT32_TYPE__</code><dt><code>__UINT64_TYPE__</code><dt><code>__INT_LEAST8_TYPE__</code><dt><code>__INT_LEAST16_TYPE__</code><dt><code>__INT_LEAST32_TYPE__</code><dt><code>__INT_LEAST64_TYPE__</code><dt><code>__UINT_LEAST8_TYPE__</code><dt><code>__UINT_LEAST16_TYPE__</code><dt><code>__UINT_LEAST32_TYPE__</code><dt><code>__UINT_LEAST64_TYPE__</code><dt><code>__INT_FAST8_TYPE__</code><dt><code>__INT_FAST16_TYPE__</code><dt><code>__INT_FAST32_TYPE__</code><dt><code>__INT_FAST64_TYPE__</code><dt><code>__UINT_FAST8_TYPE__</code><dt><code>__UINT_FAST16_TYPE__</code><dt><code>__UINT_FAST32_TYPE__</code><dt><code>__UINT_FAST64_TYPE__</code><dt><code>__INTPTR_TYPE__</code><dt><code>__UINTPTR_TYPE__</code><dd>These macros are defined to the correct underlying types for the
|
||||
<code>size_t</code>, <code>ptrdiff_t</code>, <code>wchar_t</code>, <code>wint_t</code>,
|
||||
<code>intmax_t</code>, <code>uintmax_t</code>, <code>sig_atomic_t</code>, <code>int8_t</code>,
|
||||
<code>int16_t</code>, <code>int32_t</code>, <code>int64_t</code>, <code>uint8_t</code>,
|
||||
<code>uint16_t</code>, <code>uint32_t</code>, <code>uint64_t</code>,
|
||||
<code>int_least8_t</code>, <code>int_least16_t</code>, <code>int_least32_t</code>,
|
||||
<code>int_least64_t</code>, <code>uint_least8_t</code>, <code>uint_least16_t</code>,
|
||||
<code>uint_least32_t</code>, <code>uint_least64_t</code>, <code>int_fast8_t</code>,
|
||||
<code>int_fast16_t</code>, <code>int_fast32_t</code>, <code>int_fast64_t</code>,
|
||||
<code>uint_fast8_t</code>, <code>uint_fast16_t</code>, <code>uint_fast32_t</code>,
|
||||
<code>uint_fast64_t</code>, <code>intptr_t</code>, and <code>uintptr_t</code> typedefs,
|
||||
respectively. They exist to make the standard header files
|
||||
<samp><span class="file">stddef.h</span></samp>, <samp><span class="file">stdint.h</span></samp>, and <samp><span class="file">wchar.h</span></samp> work correctly.
|
||||
You should not use these macros directly; instead, include the
|
||||
appropriate headers and use the typedefs. Some of these macros may
|
||||
not be defined on particular systems if GCC does not provide a
|
||||
<samp><span class="file">stdint.h</span></samp> header on those systems.
|
||||
|
||||
<br><dt><code>__CHAR_BIT__</code><dd>Defined to the number of bits used in the representation of the
|
||||
<code>char</code> data type. It exists to make the standard header given
|
||||
numerical limits work correctly. You should not use
|
||||
this macro directly; instead, include the appropriate headers.
|
||||
|
||||
<br><dt><code>__SCHAR_MAX__</code><dt><code>__WCHAR_MAX__</code><dt><code>__SHRT_MAX__</code><dt><code>__INT_MAX__</code><dt><code>__LONG_MAX__</code><dt><code>__LONG_LONG_MAX__</code><dt><code>__WINT_MAX__</code><dt><code>__SIZE_MAX__</code><dt><code>__PTRDIFF_MAX__</code><dt><code>__INTMAX_MAX__</code><dt><code>__UINTMAX_MAX__</code><dt><code>__SIG_ATOMIC_MAX__</code><dt><code>__INT8_MAX__</code><dt><code>__INT16_MAX__</code><dt><code>__INT32_MAX__</code><dt><code>__INT64_MAX__</code><dt><code>__UINT8_MAX__</code><dt><code>__UINT16_MAX__</code><dt><code>__UINT32_MAX__</code><dt><code>__UINT64_MAX__</code><dt><code>__INT_LEAST8_MAX__</code><dt><code>__INT_LEAST16_MAX__</code><dt><code>__INT_LEAST32_MAX__</code><dt><code>__INT_LEAST64_MAX__</code><dt><code>__UINT_LEAST8_MAX__</code><dt><code>__UINT_LEAST16_MAX__</code><dt><code>__UINT_LEAST32_MAX__</code><dt><code>__UINT_LEAST64_MAX__</code><dt><code>__INT_FAST8_MAX__</code><dt><code>__INT_FAST16_MAX__</code><dt><code>__INT_FAST32_MAX__</code><dt><code>__INT_FAST64_MAX__</code><dt><code>__UINT_FAST8_MAX__</code><dt><code>__UINT_FAST16_MAX__</code><dt><code>__UINT_FAST32_MAX__</code><dt><code>__UINT_FAST64_MAX__</code><dt><code>__INTPTR_MAX__</code><dt><code>__UINTPTR_MAX__</code><dt><code>__WCHAR_MIN__</code><dt><code>__WINT_MIN__</code><dt><code>__SIG_ATOMIC_MIN__</code><dd>Defined to the maximum value of the <code>signed char</code>, <code>wchar_t</code>,
|
||||
<code>signed short</code>,
|
||||
<code>signed int</code>, <code>signed long</code>, <code>signed long long</code>,
|
||||
<code>wint_t</code>, <code>size_t</code>, <code>ptrdiff_t</code>,
|
||||
<code>intmax_t</code>, <code>uintmax_t</code>, <code>sig_atomic_t</code>, <code>int8_t</code>,
|
||||
<code>int16_t</code>, <code>int32_t</code>, <code>int64_t</code>, <code>uint8_t</code>,
|
||||
<code>uint16_t</code>, <code>uint32_t</code>, <code>uint64_t</code>,
|
||||
<code>int_least8_t</code>, <code>int_least16_t</code>, <code>int_least32_t</code>,
|
||||
<code>int_least64_t</code>, <code>uint_least8_t</code>, <code>uint_least16_t</code>,
|
||||
<code>uint_least32_t</code>, <code>uint_least64_t</code>, <code>int_fast8_t</code>,
|
||||
<code>int_fast16_t</code>, <code>int_fast32_t</code>, <code>int_fast64_t</code>,
|
||||
<code>uint_fast8_t</code>, <code>uint_fast16_t</code>, <code>uint_fast32_t</code>,
|
||||
<code>uint_fast64_t</code>, <code>intptr_t</code>, and <code>uintptr_t</code> types and
|
||||
to the minimum value of the <code>wchar_t</code>, <code>wint_t</code>, and
|
||||
<code>sig_atomic_t</code> types respectively. They exist to make the
|
||||
standard header given numerical limits work correctly. You should not
|
||||
use these macros directly; instead, include the appropriate headers.
|
||||
Some of these macros may not be defined on particular systems if GCC
|
||||
does not provide a <samp><span class="file">stdint.h</span></samp> header on those systems.
|
||||
|
||||
<br><dt><code>__INT8_C</code><dt><code>__INT16_C</code><dt><code>__INT32_C</code><dt><code>__INT64_C</code><dt><code>__UINT8_C</code><dt><code>__UINT16_C</code><dt><code>__UINT32_C</code><dt><code>__UINT64_C</code><dt><code>__INTMAX_C</code><dt><code>__UINTMAX_C</code><dd>Defined to implementations of the standard <samp><span class="file">stdint.h</span></samp> macros with
|
||||
the same names without the leading <code>__</code>. They exist the make the
|
||||
implementation of that header work correctly. You should not use
|
||||
these macros directly; instead, include the appropriate headers. Some
|
||||
of these macros may not be defined on particular systems if GCC does
|
||||
not provide a <samp><span class="file">stdint.h</span></samp> header on those systems.
|
||||
|
||||
<br><dt><code>__SIZEOF_INT__</code><dt><code>__SIZEOF_LONG__</code><dt><code>__SIZEOF_LONG_LONG__</code><dt><code>__SIZEOF_SHORT__</code><dt><code>__SIZEOF_POINTER__</code><dt><code>__SIZEOF_FLOAT__</code><dt><code>__SIZEOF_DOUBLE__</code><dt><code>__SIZEOF_LONG_DOUBLE__</code><dt><code>__SIZEOF_SIZE_T__</code><dt><code>__SIZEOF_WCHAR_T__</code><dt><code>__SIZEOF_WINT_T__</code><dt><code>__SIZEOF_PTRDIFF_T__</code><dd>Defined to the number of bytes of the C standard data types: <code>int</code>,
|
||||
<code>long</code>, <code>long long</code>, <code>short</code>, <code>void *</code>, <code>float</code>,
|
||||
<code>double</code>, <code>long double</code>, <code>size_t</code>, <code>wchar_t</code>, <code>wint_t</code>
|
||||
and <code>ptrdiff_t</code>.
|
||||
|
||||
<br><dt><code>__DEPRECATED</code><dd>This macro is defined, with value 1, when compiling a C++ source file
|
||||
with warnings about deprecated constructs enabled. These warnings are
|
||||
enabled by default, but can be disabled with <samp><span class="option">-Wno-deprecated</span></samp>.
|
||||
|
||||
<br><dt><code>__EXCEPTIONS</code><dd>This macro is defined, with value 1, when compiling a C++ source file
|
||||
with exceptions enabled. If <samp><span class="option">-fno-exceptions</span></samp> is used when
|
||||
compiling the file, then this macro is not defined.
|
||||
|
||||
<br><dt><code>__GXX_RTTI</code><dd>This macro is defined, with value 1, when compiling a C++ source file
|
||||
with runtime type identification enabled. If <samp><span class="option">-fno-rtti</span></samp> is
|
||||
used when compiling the file, then this macro is not defined.
|
||||
|
||||
<br><dt><code>__USING_SJLJ_EXCEPTIONS__</code><dd>This macro is defined, with value 1, if the compiler uses the old
|
||||
mechanism based on <code>setjmp</code> and <code>longjmp</code> for exception
|
||||
handling.
|
||||
|
||||
<br><dt><code>__GXX_EXPERIMENTAL_CXX0X__</code><dd>This macro is defined when compiling a C++ source file with the option
|
||||
<samp><span class="option">-std=c++0x</span></samp> or <samp><span class="option">-std=gnu++0x</span></samp>. It indicates that some
|
||||
features likely to be included in C++0x are available. Note that these
|
||||
features are experimental, and may change or be removed in future
|
||||
versions of GCC.
|
||||
|
||||
<br><dt><code>__GXX_WEAK__</code><dd>This macro is defined when compiling a C++ source file. It has the
|
||||
value 1 if the compiler will use weak symbols, COMDAT sections, or
|
||||
other similar techniques to collapse symbols with “vague linkage”
|
||||
that are defined in multiple translation units. If the compiler will
|
||||
not collapse such symbols, this macro is defined with value 0. In
|
||||
general, user code should not need to make use of this macro; the
|
||||
purpose of this macro is to ease implementation of the C++ runtime
|
||||
library provided with G++.
|
||||
|
||||
<br><dt><code>__NEXT_RUNTIME__</code><dd>This macro is defined, with value 1, if (and only if) the NeXT runtime
|
||||
(as in <samp><span class="option">-fnext-runtime</span></samp>) is in use for Objective-C. If the GNU
|
||||
runtime is used, this macro is not defined, so that you can use this
|
||||
macro to determine which runtime (NeXT or GNU) is being used.
|
||||
|
||||
<br><dt><code>__LP64__</code><dt><code>_LP64</code><dd>These macros are defined, with value 1, if (and only if) the compilation
|
||||
is for a target where <code>long int</code> and pointer both use 64-bits and
|
||||
<code>int</code> uses 32-bit.
|
||||
|
||||
<br><dt><code>__SSP__</code><dd>This macro is defined, with value 1, when <samp><span class="option">-fstack-protector</span></samp> is in
|
||||
use.
|
||||
|
||||
<br><dt><code>__SSP_ALL__</code><dd>This macro is defined, with value 2, when <samp><span class="option">-fstack-protector-all</span></samp> is
|
||||
in use.
|
||||
|
||||
<br><dt><code>__TIMESTAMP__</code><dd>This macro expands to a string constant that describes the date and time
|
||||
of the last modification of the current source file. The string constant
|
||||
contains abbreviated day of the week, month, day of the month, time in
|
||||
hh:mm:ss form, year and looks like <code>"Sun Sep 16 01:03:52 1973"<!-- /@w --></code>.
|
||||
If the day of the month is less than 10, it is padded with a space on the left.
|
||||
|
||||
<p>If GCC cannot determine the current date, it will emit a warning message
|
||||
(once per compilation) and <code>__TIMESTAMP__</code> will expand to
|
||||
<code>"??? ??? ?? ??:??:?? ????"<!-- /@w --></code>.
|
||||
|
||||
<br><dt><code>__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1</code><dt><code>__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2</code><dt><code>__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4</code><dt><code>__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8</code><dt><code>__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16</code><dd>These macros are defined when the target processor supports atomic compare
|
||||
and swap operations on operands 1, 2, 4, 8 or 16 bytes in length, respectively.
|
||||
|
||||
<br><dt><code>__GCC_HAVE_DWARF2_CFI_ASM</code><dd>This macro is defined when the compiler is emitting Dwarf2 CFI directives
|
||||
to the assembler. When this is defined, it is possible to emit those same
|
||||
directives in inline assembly.
|
||||
</dl>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,134 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Computed Includes - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Header-Files.html#Header-Files" title="Header Files">
|
||||
<link rel="prev" href="Alternatives-to-Wrapper-_0023ifndef.html#Alternatives-to-Wrapper-_0023ifndef" title="Alternatives to Wrapper #ifndef">
|
||||
<link rel="next" href="Wrapper-Headers.html#Wrapper-Headers" title="Wrapper Headers">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Computed-Includes"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Wrapper-Headers.html#Wrapper-Headers">Wrapper Headers</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Alternatives-to-Wrapper-_0023ifndef.html#Alternatives-to-Wrapper-_0023ifndef">Alternatives to Wrapper #ifndef</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Header-Files.html#Header-Files">Header Files</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">2.6 Computed Includes</h3>
|
||||
|
||||
<p><a name="index-computed-includes-34"></a><a name="index-macros-in-include-35"></a>
|
||||
Sometimes it is necessary to select one of several different header
|
||||
files to be included into your program. They might specify
|
||||
configuration parameters to be used on different sorts of operating
|
||||
systems, for instance. You could do this with a series of conditionals,
|
||||
|
||||
<pre class="smallexample"> #if SYSTEM_1
|
||||
# include "system_1.h"
|
||||
#elif SYSTEM_2
|
||||
# include "system_2.h"
|
||||
#elif SYSTEM_3
|
||||
...
|
||||
#endif
|
||||
</pre>
|
||||
<p>That rapidly becomes tedious. Instead, the preprocessor offers the
|
||||
ability to use a macro for the header name. This is called a
|
||||
<dfn>computed include</dfn>. Instead of writing a header name as the direct
|
||||
argument of ‘<samp><span class="samp">#include</span></samp>’, you simply put a macro name there instead:
|
||||
|
||||
<pre class="smallexample"> #define SYSTEM_H "system_1.h"
|
||||
...
|
||||
#include SYSTEM_H
|
||||
</pre>
|
||||
<p class="noindent"><code>SYSTEM_H</code> will be expanded, and the preprocessor will look for
|
||||
<samp><span class="file">system_1.h</span></samp> as if the ‘<samp><span class="samp">#include</span></samp>’ had been written that way
|
||||
originally. <code>SYSTEM_H</code> could be defined by your Makefile with a
|
||||
<samp><span class="option">-D</span></samp> option.
|
||||
|
||||
<p>You must be careful when you define the macro. ‘<samp><span class="samp">#define</span></samp>’ saves
|
||||
tokens, not text. The preprocessor has no way of knowing that the macro
|
||||
will be used as the argument of ‘<samp><span class="samp">#include</span></samp>’, so it generates
|
||||
ordinary tokens, not a header name. This is unlikely to cause problems
|
||||
if you use double-quote includes, which are close enough to string
|
||||
constants. If you use angle brackets, however, you may have trouble.
|
||||
|
||||
<p>The syntax of a computed include is actually a bit more general than the
|
||||
above. If the first non-whitespace character after ‘<samp><span class="samp">#include</span></samp>’ is
|
||||
not ‘<samp><span class="samp">"</span></samp>’ or ‘<samp><span class="samp"><</span></samp>’, then the entire line is macro-expanded
|
||||
like running text would be.
|
||||
|
||||
<p>If the line expands to a single string constant, the contents of that
|
||||
string constant are the file to be included. CPP does not re-examine the
|
||||
string for embedded quotes, but neither does it process backslash
|
||||
escapes in the string. Therefore
|
||||
|
||||
<pre class="smallexample"> #define HEADER "a\"b"
|
||||
#include HEADER
|
||||
</pre>
|
||||
<p class="noindent">looks for a file named <samp><span class="file">a\"b</span></samp>. CPP searches for the file according
|
||||
to the rules for double-quoted includes.
|
||||
|
||||
<p>If the line expands to a token stream beginning with a ‘<samp><span class="samp"><</span></samp>’ token
|
||||
and including a ‘<samp><span class="samp">></span></samp>’ token, then the tokens between the ‘<samp><span class="samp"><</span></samp>’ and
|
||||
the first ‘<samp><span class="samp">></span></samp>’ are combined to form the filename to be included.
|
||||
Any whitespace between tokens is reduced to a single space; then any
|
||||
space after the initial ‘<samp><span class="samp"><</span></samp>’ is retained, but a trailing space
|
||||
before the closing ‘<samp><span class="samp">></span></samp>’ is ignored. CPP searches for the file
|
||||
according to the rules for angle-bracket includes.
|
||||
|
||||
<p>In either case, if there are any tokens on the line after the file name,
|
||||
an error occurs and the directive is not processed. It is also an error
|
||||
if the result of expansion does not match either of the two expected
|
||||
forms.
|
||||
|
||||
<p>These rules are implementation-defined behavior according to the C
|
||||
standard. To minimize the risk of different compilers interpreting your
|
||||
computed includes differently, we recommend you use only a single
|
||||
object-like macro which expands to a string constant. This will also
|
||||
minimize confusion for people reading your program.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,135 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Concatenation - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macros.html#Macros" title="Macros">
|
||||
<link rel="prev" href="Stringification.html#Stringification" title="Stringification">
|
||||
<link rel="next" href="Variadic-Macros.html#Variadic-Macros" title="Variadic Macros">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Concatenation"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Variadic-Macros.html#Variadic-Macros">Variadic Macros</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Stringification.html#Stringification">Stringification</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macros.html#Macros">Macros</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">3.5 Concatenation</h3>
|
||||
|
||||
<p><a name="index-concatenation-52"></a><a name="index-token-pasting-53"></a><a name="index-token-concatenation-54"></a><a name="index-g_t_0040samp_007b_0023_0023_007d-operator-55"></a>
|
||||
It is often useful to merge two tokens into one while expanding macros.
|
||||
This is called <dfn>token pasting</dfn> or <dfn>token concatenation</dfn>. The
|
||||
‘<samp><span class="samp">##</span></samp>’ preprocessing operator performs token pasting. When a macro
|
||||
is expanded, the two tokens on either side of each ‘<samp><span class="samp">##</span></samp>’ operator
|
||||
are combined into a single token, which then replaces the ‘<samp><span class="samp">##</span></samp>’ and
|
||||
the two original tokens in the macro expansion. Usually both will be
|
||||
identifiers, or one will be an identifier and the other a preprocessing
|
||||
number. When pasted, they make a longer identifier. This isn't the
|
||||
only valid case. It is also possible to concatenate two numbers (or a
|
||||
number and a name, such as <code>1.5</code> and <code>e3</code>) into a number.
|
||||
Also, multi-character operators such as <code>+=</code> can be formed by
|
||||
token pasting.
|
||||
|
||||
<p>However, two tokens that don't together form a valid token cannot be
|
||||
pasted together. For example, you cannot concatenate <code>x</code> with
|
||||
<code>+</code> in either order. If you try, the preprocessor issues a warning
|
||||
and emits the two tokens. Whether it puts white space between the
|
||||
tokens is undefined. It is common to find unnecessary uses of ‘<samp><span class="samp">##</span></samp>’
|
||||
in complex macros. If you get this warning, it is likely that you can
|
||||
simply remove the ‘<samp><span class="samp">##</span></samp>’.
|
||||
|
||||
<p>Both the tokens combined by ‘<samp><span class="samp">##</span></samp>’ could come from the macro body,
|
||||
but you could just as well write them as one token in the first place.
|
||||
Token pasting is most useful when one or both of the tokens comes from a
|
||||
macro argument. If either of the tokens next to an ‘<samp><span class="samp">##</span></samp>’ is a
|
||||
parameter name, it is replaced by its actual argument before ‘<samp><span class="samp">##</span></samp>’
|
||||
executes. As with stringification, the actual argument is not
|
||||
macro-expanded first. If the argument is empty, that ‘<samp><span class="samp">##</span></samp>’ has no
|
||||
effect.
|
||||
|
||||
<p>Keep in mind that the C preprocessor converts comments to whitespace
|
||||
before macros are even considered. Therefore, you cannot create a
|
||||
comment by concatenating ‘<samp><span class="samp">/</span></samp>’ and ‘<samp><span class="samp">*</span></samp>’. You can put as much
|
||||
whitespace between ‘<samp><span class="samp">##</span></samp>’ and its operands as you like, including
|
||||
comments, and you can put comments in arguments that will be
|
||||
concatenated. However, it is an error if ‘<samp><span class="samp">##</span></samp>’ appears at either
|
||||
end of a macro body.
|
||||
|
||||
<p>Consider a C program that interprets named commands. There probably
|
||||
needs to be a table of commands, perhaps an array of structures declared
|
||||
as follows:
|
||||
|
||||
<pre class="smallexample"> struct command
|
||||
{
|
||||
char *name;
|
||||
void (*function) (void);
|
||||
};
|
||||
|
||||
struct command commands[] =
|
||||
{
|
||||
{ "quit", quit_command },
|
||||
{ "help", help_command },
|
||||
...
|
||||
};
|
||||
</pre>
|
||||
<p>It would be cleaner not to have to give each command name twice, once in
|
||||
the string constant and once in the function name. A macro which takes the
|
||||
name of a command as an argument can make this unnecessary. The string
|
||||
constant can be created with stringification, and the function name by
|
||||
concatenating the argument with ‘<samp><span class="samp">_command</span></samp>’. Here is how it is done:
|
||||
|
||||
<pre class="smallexample"> #define COMMAND(NAME) { #NAME, NAME ## _command }
|
||||
|
||||
struct command commands[] =
|
||||
{
|
||||
COMMAND (quit),
|
||||
COMMAND (help),
|
||||
...
|
||||
};
|
||||
</pre>
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,172 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Concept Index - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="Option-Index.html#Option-Index" title="Option Index">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Concept-Index"></a>
|
||||
<p>
|
||||
Previous: <a rel="previous" accesskey="p" href="Option-Index.html#Option-Index">Option Index</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="unnumbered">Concept Index</h2>
|
||||
|
||||
|
||||
|
||||
<ul class="index-cp" compact>
|
||||
<li><a href="Stringification.html#index-g_t_0040samp_007b_0023_007d-operator-51">‘<samp><span class="samp">#</span></samp>’ operator</a>: <a href="Stringification.html#Stringification">Stringification</a></li>
|
||||
<li><a href="Concatenation.html#index-g_t_0040samp_007b_0023_0023_007d-operator-55">‘<samp><span class="samp">##</span></samp>’ operator</a>: <a href="Concatenation.html#Concatenation">Concatenation</a></li>
|
||||
<li><a href="Pragmas.html#index-g_t_0040code_007b_005fPragma_007d-100"><code>_Pragma</code></a>: <a href="Pragmas.html#Pragmas">Pragmas</a></li>
|
||||
<li><a href="Tokenization.html#index-alternative-tokens-19">alternative tokens</a>: <a href="Tokenization.html#Tokenization">Tokenization</a></li>
|
||||
<li><a href="Macro-Arguments.html#index-arguments-46">arguments</a>: <a href="Macro-Arguments.html#Macro-Arguments">Macro Arguments</a></li>
|
||||
<li><a href="Macro-Arguments.html#index-arguments-in-macro-definitions-48">arguments in macro definitions</a>: <a href="Macro-Arguments.html#Macro-Arguments">Macro Arguments</a></li>
|
||||
<li><a href="Obsolete-Features.html#index-assertions-111">assertions</a>: <a href="Obsolete-Features.html#Obsolete-Features">Obsolete Features</a></li>
|
||||
<li><a href="Obsolete-Features.html#index-assertions_002c-canceling-115">assertions, canceling</a>: <a href="Obsolete-Features.html#Obsolete-Features">Obsolete Features</a></li>
|
||||
<li><a href="Initial-processing.html#index-backslash_002dnewline-4">backslash-newline</a>: <a href="Initial-processing.html#Initial-processing">Initial processing</a></li>
|
||||
<li><a href="Initial-processing.html#index-block-comments-7">block comments</a>: <a href="Initial-processing.html#Initial-processing">Initial processing</a></li>
|
||||
<li><a href="C_002b_002b-Named-Operators.html#index-C_002b_002b-named-operators-66">C++ named operators</a>: <a href="C_002b_002b-Named-Operators.html#C_002b_002b-Named-Operators">C++ Named Operators</a></li>
|
||||
<li><a href="Tokenization.html#index-character-constants-15">character constants</a>: <a href="Tokenization.html#Tokenization">Tokenization</a></li>
|
||||
<li><a href="Invocation.html#index-character-set_002c-execution-174">character set, execution</a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-character-set_002c-input-178">character set, input</a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-character-set_002c-wide-execution-176">character set, wide execution</a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-command-line-119">command line</a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Deleted-Code.html#index-commenting-out-code-92">commenting out code</a>: <a href="Deleted-Code.html#Deleted-Code">Deleted Code</a></li>
|
||||
<li><a href="Initial-processing.html#index-comments-5">comments</a>: <a href="Initial-processing.html#Initial-processing">Initial processing</a></li>
|
||||
<li><a href="Common-Predefined-Macros.html#index-common-predefined-macros-61">common predefined macros</a>: <a href="Common-Predefined-Macros.html#Common-Predefined-Macros">Common Predefined Macros</a></li>
|
||||
<li><a href="Computed-Includes.html#index-computed-includes-34">computed includes</a>: <a href="Computed-Includes.html#Computed-Includes">Computed Includes</a></li>
|
||||
<li><a href="Concatenation.html#index-concatenation-52">concatenation</a>: <a href="Concatenation.html#Concatenation">Concatenation</a></li>
|
||||
<li><a href="Ifdef.html#index-conditional-group-87">conditional group</a>: <a href="Ifdef.html#Ifdef">Ifdef</a></li>
|
||||
<li><a href="Conditionals.html#index-conditionals-83">conditionals</a>: <a href="Conditionals.html#Conditionals">Conditionals</a></li>
|
||||
<li><a href="Initial-processing.html#index-continued-lines-3">continued lines</a>: <a href="Initial-processing.html#Initial-processing">Initial processing</a></li>
|
||||
<li><a href="Once_002dOnly-Headers.html#index-controlling-macro-31">controlling macro</a>: <a href="Once_002dOnly-Headers.html#Once_002dOnly-Headers">Once-Only Headers</a></li>
|
||||
<li><a href="Defined.html#index-g_t_0040code_007bdefined_007d-89"><code>defined</code></a>: <a href="Defined.html#Defined">Defined</a></li>
|
||||
<li><a href="Environment-Variables.html#index-dependencies-for-make-as-output-204">dependencies for make as output</a>: <a href="Environment-Variables.html#Environment-Variables">Environment Variables</a></li>
|
||||
<li><a href="Invocation.html#index-dependencies_002c-make-143">dependencies, make</a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Diagnostics.html#index-diagnostic-93">diagnostic</a>: <a href="Diagnostics.html#Diagnostics">Diagnostics</a></li>
|
||||
<li><a href="Differences-from-previous-versions.html#index-differences-from-previous-versions-117">differences from previous versions</a>: <a href="Differences-from-previous-versions.html#Differences-from-previous-versions">Differences from previous versions</a></li>
|
||||
<li><a href="Tokenization.html#index-digraphs-18">digraphs</a>: <a href="Tokenization.html#Tokenization">Tokenization</a></li>
|
||||
<li><a href="The-preprocessing-language.html#index-directive-line-23">directive line</a>: <a href="The-preprocessing-language.html#The-preprocessing-language">The preprocessing language</a></li>
|
||||
<li><a href="The-preprocessing-language.html#index-directive-name-24">directive name</a>: <a href="The-preprocessing-language.html#The-preprocessing-language">The preprocessing language</a></li>
|
||||
<li><a href="The-preprocessing-language.html#index-directives-21">directives</a>: <a href="The-preprocessing-language.html#The-preprocessing-language">The preprocessing language</a></li>
|
||||
<li><a href="Macro-Arguments.html#index-empty-macro-arguments-49">empty macro arguments</a>: <a href="Macro-Arguments.html#Macro-Arguments">Macro Arguments</a></li>
|
||||
<li><a href="Environment-Variables.html#index-environment-variables-198">environment variables</a>: <a href="Environment-Variables.html#Environment-Variables">Environment Variables</a></li>
|
||||
<li><a href="Argument-Prescan.html#index-expansion-of-arguments-79">expansion of arguments</a>: <a href="Argument-Prescan.html#Argument-Prescan">Argument Prescan</a></li>
|
||||
<li><a href="GNU-Free-Documentation-License.html#index-FDL_002c-GNU-Free-Documentation-License-207">FDL, GNU Free Documentation License</a>: <a href="GNU-Free-Documentation-License.html#GNU-Free-Documentation-License">GNU Free Documentation License</a></li>
|
||||
<li><a href="Function_002dlike-Macros.html#index-function_002dlike-macros-45">function-like macros</a>: <a href="Function_002dlike-Macros.html#Function_002dlike-Macros">Function-like Macros</a></li>
|
||||
<li><a href="Invocation.html#index-grouping-options-120">grouping options</a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Once_002dOnly-Headers.html#index-guard-macro-32">guard macro</a>: <a href="Once_002dOnly-Headers.html#Once_002dOnly-Headers">Once-Only Headers</a></li>
|
||||
<li><a href="Header-Files.html#index-header-file-25">header file</a>: <a href="Header-Files.html#Header-Files">Header Files</a></li>
|
||||
<li><a href="Tokenization.html#index-header-file-names-16">header file names</a>: <a href="Tokenization.html#Tokenization">Tokenization</a></li>
|
||||
<li><a href="Tokenization.html#index-identifiers-10">identifiers</a>: <a href="Tokenization.html#Tokenization">Tokenization</a></li>
|
||||
<li><a href="Implementation-limits.html#index-implementation-limits-110">implementation limits</a>: <a href="Implementation-limits.html#Implementation-limits">Implementation limits</a></li>
|
||||
<li><a href="Implementation_002ddefined-behavior.html#index-implementation_002ddefined-behavior-109">implementation-defined behavior</a>: <a href="Implementation_002ddefined-behavior.html#Implementation_002ddefined-behavior">Implementation-defined behavior</a></li>
|
||||
<li><a href="Once_002dOnly-Headers.html#index-including-just-once-29">including just once</a>: <a href="Once_002dOnly-Headers.html#Once_002dOnly-Headers">Once-Only Headers</a></li>
|
||||
<li><a href="Invocation.html#index-invocation-118">invocation</a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="C_002b_002b-Named-Operators.html#index-iso646_002eh-67">iso646.h</a>: <a href="C_002b_002b-Named-Operators.html#C_002b_002b-Named-Operators">C++ Named Operators</a></li>
|
||||
<li><a href="Initial-processing.html#index-line-comments-6">line comments</a>: <a href="Initial-processing.html#Initial-processing">Initial processing</a></li>
|
||||
<li><a href="Line-Control.html#index-line-control-98">line control</a>: <a href="Line-Control.html#Line-Control">Line Control</a></li>
|
||||
<li><a href="Initial-processing.html#index-line-endings-1">line endings</a>: <a href="Initial-processing.html#Initial-processing">Initial processing</a></li>
|
||||
<li><a href="Preprocessor-Output.html#index-linemarkers-108">linemarkers</a>: <a href="Preprocessor-Output.html#Preprocessor-Output">Preprocessor Output</a></li>
|
||||
<li><a href="Argument-Prescan.html#index-macro-argument-expansion-80">macro argument expansion</a>: <a href="Argument-Prescan.html#Argument-Prescan">Argument Prescan</a></li>
|
||||
<li><a href="Directives-Within-Macro-Arguments.html#index-macro-arguments-and-directives-71">macro arguments and directives</a>: <a href="Directives-Within-Macro-Arguments.html#Directives-Within-Macro-Arguments">Directives Within Macro Arguments</a></li>
|
||||
<li><a href="Computed-Includes.html#index-macros-in-include-35">macros in include</a>: <a href="Computed-Includes.html#Computed-Includes">Computed Includes</a></li>
|
||||
<li><a href="Macro-Arguments.html#index-macros-with-arguments-47">macros with arguments</a>: <a href="Macro-Arguments.html#Macro-Arguments">Macro Arguments</a></li>
|
||||
<li><a href="Variadic-Macros.html#index-macros-with-variable-arguments-57">macros with variable arguments</a>: <a href="Variadic-Macros.html#Variadic-Macros">Variadic Macros</a></li>
|
||||
<li><a href="Invocation.html#index-make-142">make</a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Object_002dlike-Macros.html#index-manifest-constants-43">manifest constants</a>: <a href="Object_002dlike-Macros.html#Object_002dlike-Macros">Object-like Macros</a></li>
|
||||
<li><a href="C_002b_002b-Named-Operators.html#index-named-operators-65">named operators</a>: <a href="C_002b_002b-Named-Operators.html#C_002b_002b-Named-Operators">C++ Named Operators</a></li>
|
||||
<li><a href="Newlines-in-Arguments.html#index-newlines-in-macro-arguments-82">newlines in macro arguments</a>: <a href="Newlines-in-Arguments.html#Newlines-in-Arguments">Newlines in Arguments</a></li>
|
||||
<li><a href="Other-Directives.html#index-null-directive-106">null directive</a>: <a href="Other-Directives.html#Other-Directives">Other Directives</a></li>
|
||||
<li><a href="Tokenization.html#index-numbers-11">numbers</a>: <a href="Tokenization.html#Tokenization">Tokenization</a></li>
|
||||
<li><a href="Object_002dlike-Macros.html#index-object_002dlike-macro-41">object-like macro</a>: <a href="Object_002dlike-Macros.html#Object_002dlike-Macros">Object-like Macros</a></li>
|
||||
<li><a href="Invocation.html#index-options-122">options</a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-options_002c-grouping-121">options, grouping</a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Tokenization.html#index-other-tokens-20">other tokens</a>: <a href="Tokenization.html#Tokenization">Tokenization</a></li>
|
||||
<li><a href="Preprocessor-Output.html#index-output-format-107">output format</a>: <a href="Preprocessor-Output.html#Preprocessor-Output">Preprocessor Output</a></li>
|
||||
<li><a href="Wrapper-Headers.html#index-overriding-a-header-file-37">overriding a header file</a>: <a href="Wrapper-Headers.html#Wrapper-Headers">Wrapper Headers</a></li>
|
||||
<li><a href="Operator-Precedence-Problems.html#index-parentheses-in-macro-bodies-74">parentheses in macro bodies</a>: <a href="Operator-Precedence-Problems.html#Operator-Precedence-Problems">Operator Precedence Problems</a></li>
|
||||
<li><a href="Macro-Pitfalls.html#index-pitfalls-of-macros-73">pitfalls of macros</a>: <a href="Macro-Pitfalls.html#Macro-Pitfalls">Macro Pitfalls</a></li>
|
||||
<li><a href="Predefined-Macros.html#index-predefined-macros-59">predefined macros</a>: <a href="Predefined-Macros.html#Predefined-Macros">Predefined Macros</a></li>
|
||||
<li><a href="System_002dspecific-Predefined-Macros.html#index-predefined-macros_002c-system_002dspecific-63">predefined macros, system-specific</a>: <a href="System_002dspecific-Predefined-Macros.html#System_002dspecific-Predefined-Macros">System-specific Predefined Macros</a></li>
|
||||
<li><a href="Obsolete-Features.html#index-predicates-112">predicates</a>: <a href="Obsolete-Features.html#Obsolete-Features">Obsolete Features</a></li>
|
||||
<li><a href="The-preprocessing-language.html#index-preprocessing-directives-22">preprocessing directives</a>: <a href="The-preprocessing-language.html#The-preprocessing-language">The preprocessing language</a></li>
|
||||
<li><a href="Tokenization.html#index-preprocessing-numbers-12">preprocessing numbers</a>: <a href="Tokenization.html#Tokenization">Tokenization</a></li>
|
||||
<li><a href="Tokenization.html#index-preprocessing-tokens-9">preprocessing tokens</a>: <a href="Tokenization.html#Tokenization">Tokenization</a></li>
|
||||
<li><a href="Argument-Prescan.html#index-prescan-of-macro-arguments-81">prescan of macro arguments</a>: <a href="Argument-Prescan.html#Argument-Prescan">Argument Prescan</a></li>
|
||||
<li><a href="Macro-Pitfalls.html#index-problems-with-macros-72">problems with macros</a>: <a href="Macro-Pitfalls.html#Macro-Pitfalls">Macro Pitfalls</a></li>
|
||||
<li><a href="Tokenization.html#index-punctuators-17">punctuators</a>: <a href="Tokenization.html#Tokenization">Tokenization</a></li>
|
||||
<li><a href="Undefining-and-Redefining-Macros.html#index-redefining-macros-69">redefining macros</a>: <a href="Undefining-and-Redefining-Macros.html#Undefining-and-Redefining-Macros">Undefining and Redefining Macros</a></li>
|
||||
<li><a href="Once_002dOnly-Headers.html#index-repeated-inclusion-28">repeated inclusion</a>: <a href="Once_002dOnly-Headers.html#Once_002dOnly-Headers">Once-Only Headers</a></li>
|
||||
<li><a href="Diagnostics.html#index-reporting-errors-94">reporting errors</a>: <a href="Diagnostics.html#Diagnostics">Diagnostics</a></li>
|
||||
<li><a href="Diagnostics.html#index-reporting-warnings-95">reporting warnings</a>: <a href="Diagnostics.html#Diagnostics">Diagnostics</a></li>
|
||||
<li><a href="System_002dspecific-Predefined-Macros.html#index-reserved-namespace-64">reserved namespace</a>: <a href="System_002dspecific-Predefined-Macros.html#System_002dspecific-Predefined-Macros">System-specific Predefined Macros</a></li>
|
||||
<li><a href="Self_002dReferential-Macros.html#index-self_002dreference-78">self-reference</a>: <a href="Self_002dReferential-Macros.html#Self_002dReferential-Macros">Self-Referential Macros</a></li>
|
||||
<li><a href="Swallowing-the-Semicolon.html#index-semicolons-_0028after-macro-calls_0029-75">semicolons (after macro calls)</a>: <a href="Swallowing-the-Semicolon.html#Swallowing-the-Semicolon">Swallowing the Semicolon</a></li>
|
||||
<li><a href="Duplication-of-Side-Effects.html#index-side-effects-_0028in-macro-arguments_0029-76">side effects (in macro arguments)</a>: <a href="Duplication-of-Side-Effects.html#Duplication-of-Side-Effects">Duplication of Side Effects</a></li>
|
||||
<li><a href="Standard-Predefined-Macros.html#index-standard-predefined-macros_002e-60">standard predefined macros.</a>: <a href="Standard-Predefined-Macros.html#Standard-Predefined-Macros">Standard Predefined Macros</a></li>
|
||||
<li><a href="Tokenization.html#index-string-constants-14">string constants</a>: <a href="Tokenization.html#Tokenization">Tokenization</a></li>
|
||||
<li><a href="Tokenization.html#index-string-literals-13">string literals</a>: <a href="Tokenization.html#Tokenization">Tokenization</a></li>
|
||||
<li><a href="Stringification.html#index-stringification-50">stringification</a>: <a href="Stringification.html#Stringification">Stringification</a></li>
|
||||
<li><a href="Object_002dlike-Macros.html#index-symbolic-constants-42">symbolic constants</a>: <a href="Object_002dlike-Macros.html#Object_002dlike-Macros">Object-like Macros</a></li>
|
||||
<li><a href="System-Headers.html#index-system-header-files-39">system header files</a>: <a href="System-Headers.html#System-Headers">System Headers</a></li>
|
||||
<li><a href="Header-Files.html#index-system-header-files-26">system header files</a>: <a href="Header-Files.html#Header-Files">Header Files</a></li>
|
||||
<li><a href="System_002dspecific-Predefined-Macros.html#index-system_002dspecific-predefined-macros-62">system-specific predefined macros</a>: <a href="System_002dspecific-Predefined-Macros.html#System_002dspecific-Predefined-Macros">System-specific Predefined Macros</a></li>
|
||||
<li><a href="Obsolete-Features.html#index-testing-predicates-113">testing predicates</a>: <a href="Obsolete-Features.html#Obsolete-Features">Obsolete Features</a></li>
|
||||
<li><a href="Concatenation.html#index-token-concatenation-54">token concatenation</a>: <a href="Concatenation.html#Concatenation">Concatenation</a></li>
|
||||
<li><a href="Concatenation.html#index-token-pasting-53">token pasting</a>: <a href="Concatenation.html#Concatenation">Concatenation</a></li>
|
||||
<li><a href="Tokenization.html#index-tokens-8">tokens</a>: <a href="Tokenization.html#Tokenization">Tokenization</a></li>
|
||||
<li><a href="Initial-processing.html#index-trigraphs-2">trigraphs</a>: <a href="Initial-processing.html#Initial-processing">Initial processing</a></li>
|
||||
<li><a href="Undefining-and-Redefining-Macros.html#index-undefining-macros-68">undefining macros</a>: <a href="Undefining-and-Redefining-Macros.html#Undefining-and-Redefining-Macros">Undefining and Redefining Macros</a></li>
|
||||
<li><a href="Duplication-of-Side-Effects.html#index-unsafe-macros-77">unsafe macros</a>: <a href="Duplication-of-Side-Effects.html#Duplication-of-Side-Effects">Duplication of Side Effects</a></li>
|
||||
<li><a href="Variadic-Macros.html#index-variable-number-of-arguments-56">variable number of arguments</a>: <a href="Variadic-Macros.html#Variadic-Macros">Variadic Macros</a></li>
|
||||
<li><a href="Variadic-Macros.html#index-variadic-macros-58">variadic macros</a>: <a href="Variadic-Macros.html#Variadic-Macros">Variadic Macros</a></li>
|
||||
<li><a href="Once_002dOnly-Headers.html#index-wrapper-_0040code_007b_0023ifndef_007d-30">wrapper <code>#ifndef</code></a>: <a href="Once_002dOnly-Headers.html#Once_002dOnly-Headers">Once-Only Headers</a></li>
|
||||
<li><a href="Wrapper-Headers.html#index-wrapper-headers-36">wrapper headers</a>: <a href="Wrapper-Headers.html#Wrapper-Headers">Wrapper Headers</a></li>
|
||||
</ul></body></html>
|
||||
|
@@ -0,0 +1,75 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Conditional Syntax - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Conditionals.html#Conditionals" title="Conditionals">
|
||||
<link rel="prev" href="Conditional-Uses.html#Conditional-Uses" title="Conditional Uses">
|
||||
<link rel="next" href="Deleted-Code.html#Deleted-Code" title="Deleted Code">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Conditional-Syntax"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Deleted-Code.html#Deleted-Code">Deleted Code</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Conditional-Uses.html#Conditional-Uses">Conditional Uses</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Conditionals.html#Conditionals">Conditionals</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">4.2 Conditional Syntax</h3>
|
||||
|
||||
<p><a name="index-g_t_0023if-84"></a>A conditional in the C preprocessor begins with a <dfn>conditional
|
||||
directive</dfn>: ‘<samp><span class="samp">#if</span></samp>’, ‘<samp><span class="samp">#ifdef</span></samp>’ or ‘<samp><span class="samp">#ifndef</span></samp>’.
|
||||
|
||||
<ul class="menu">
|
||||
<li><a accesskey="1" href="Ifdef.html#Ifdef">Ifdef</a>
|
||||
<li><a accesskey="2" href="If.html#If">If</a>
|
||||
<li><a accesskey="3" href="Defined.html#Defined">Defined</a>
|
||||
<li><a accesskey="4" href="Else.html#Else">Else</a>
|
||||
<li><a accesskey="5" href="Elif.html#Elif">Elif</a>
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,87 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Conditional Uses - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Conditionals.html#Conditionals" title="Conditionals">
|
||||
<link rel="next" href="Conditional-Syntax.html#Conditional-Syntax" title="Conditional Syntax">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Conditional-Uses"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Conditional-Syntax.html#Conditional-Syntax">Conditional Syntax</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Conditionals.html#Conditionals">Conditionals</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">4.1 Conditional Uses</h3>
|
||||
|
||||
<p>There are three general reasons to use a conditional.
|
||||
|
||||
<ul>
|
||||
<li>A program may need to use different code depending on the machine or
|
||||
operating system it is to run on. In some cases the code for one
|
||||
operating system may be erroneous on another operating system; for
|
||||
example, it might refer to data types or constants that do not exist on
|
||||
the other system. When this happens, it is not enough to avoid
|
||||
executing the invalid code. Its mere presence will cause the compiler
|
||||
to reject the program. With a preprocessing conditional, the offending
|
||||
code can be effectively excised from the program when it is not valid.
|
||||
|
||||
<li>You may want to be able to compile the same source file into two
|
||||
different programs. One version might make frequent time-consuming
|
||||
consistency checks on its intermediate data, or print the values of
|
||||
those data for debugging, and the other not.
|
||||
|
||||
<li>A conditional whose condition is always false is one way to exclude code
|
||||
from the program but keep it as a sort of comment for future reference.
|
||||
</ul>
|
||||
|
||||
<p>Simple programs that do not need system-specific logic or complex
|
||||
debugging hooks generally will not need to use preprocessing
|
||||
conditionals.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,99 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Conditionals - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="Macros.html#Macros" title="Macros">
|
||||
<link rel="next" href="Diagnostics.html#Diagnostics" title="Diagnostics">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Conditionals"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Diagnostics.html#Diagnostics">Diagnostics</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Macros.html#Macros">Macros</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="chapter">4 Conditionals</h2>
|
||||
|
||||
<p><a name="index-conditionals-83"></a>
|
||||
A <dfn>conditional</dfn> is a directive that instructs the preprocessor to
|
||||
select whether or not to include a chunk of code in the final token
|
||||
stream passed to the compiler. Preprocessor conditionals can test
|
||||
arithmetic expressions, or whether a name is defined as a macro, or both
|
||||
simultaneously using the special <code>defined</code> operator.
|
||||
|
||||
<p>A conditional in the C preprocessor resembles in some ways an <code>if</code>
|
||||
statement in C, but it is important to understand the difference between
|
||||
them. The condition in an <code>if</code> statement is tested during the
|
||||
execution of your program. Its purpose is to allow your program to
|
||||
behave differently from run to run, depending on the data it is
|
||||
operating on. The condition in a preprocessing conditional directive is
|
||||
tested when your program is compiled. Its purpose is to allow different
|
||||
code to be included in the program depending on the situation at the
|
||||
time of compilation.
|
||||
|
||||
<p>However, the distinction is becoming less clear. Modern compilers often
|
||||
do test <code>if</code> statements when a program is compiled, if their
|
||||
conditions are known not to vary at run time, and eliminate code which
|
||||
can never be executed. If you can count on your compiler to do this,
|
||||
you may find that your program is more readable if you use <code>if</code>
|
||||
statements with constant conditions (perhaps determined by macros). Of
|
||||
course, you can only use this to exclude code, not type definitions or
|
||||
other preprocessing directives, and you can only do it if the code
|
||||
remains syntactically valid when it is not to be used.
|
||||
|
||||
<p>GCC version 3 eliminates this kind of never-executed code even when
|
||||
not optimizing. Older versions did it only when optimizing.
|
||||
|
||||
<ul class="menu">
|
||||
<li><a accesskey="1" href="Conditional-Uses.html#Conditional-Uses">Conditional Uses</a>
|
||||
<li><a accesskey="2" href="Conditional-Syntax.html#Conditional-Syntax">Conditional Syntax</a>
|
||||
<li><a accesskey="3" href="Deleted-Code.html#Deleted-Code">Deleted Code</a>
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,92 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Defined - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Conditional-Syntax.html#Conditional-Syntax" title="Conditional Syntax">
|
||||
<link rel="prev" href="If.html#If" title="If">
|
||||
<link rel="next" href="Else.html#Else" title="Else">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Defined"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Else.html#Else">Else</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="If.html#If">If</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Conditional-Syntax.html#Conditional-Syntax">Conditional Syntax</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h4 class="subsection">4.2.3 Defined</h4>
|
||||
|
||||
<p><a name="index-g_t_0040code_007bdefined_007d-89"></a>The special operator <code>defined</code> is used in ‘<samp><span class="samp">#if</span></samp>’ and
|
||||
‘<samp><span class="samp">#elif</span></samp>’ expressions to test whether a certain name is defined as a
|
||||
macro. <code>defined </code><var>name</var> and <code>defined (</code><var>name</var><code>)</code> are
|
||||
both expressions whose value is 1 if <var>name</var> is defined as a macro at
|
||||
the current point in the program, and 0 otherwise. Thus, <code>#if defined MACRO<!-- /@w --></code> is precisely equivalent to <code>#ifdef MACRO<!-- /@w --></code>.
|
||||
|
||||
<p><code>defined</code> is useful when you wish to test more than one macro for
|
||||
existence at once. For example,
|
||||
|
||||
<pre class="smallexample"> #if defined (__vax__) || defined (__ns16000__)
|
||||
</pre>
|
||||
<p class="noindent">would succeed if either of the names <code>__vax__</code> or
|
||||
<code>__ns16000__</code> is defined as a macro.
|
||||
|
||||
<p>Conditionals written like this:
|
||||
|
||||
<pre class="smallexample"> #if defined BUFSIZE && BUFSIZE >= 1024
|
||||
</pre>
|
||||
<p class="noindent">can generally be simplified to just <code>#if BUFSIZE >= 1024<!-- /@w --></code>,
|
||||
since if <code>BUFSIZE</code> is not defined, it will be interpreted as having
|
||||
the value zero.
|
||||
|
||||
<p>If the <code>defined</code> operator appears as a result of a macro expansion,
|
||||
the C standard says the behavior is undefined. GNU cpp treats it as a
|
||||
genuine <code>defined</code> operator and evaluates it normally. It will warn
|
||||
wherever your code uses this feature if you use the command-line option
|
||||
<samp><span class="option">-pedantic</span></samp>, since other compilers may handle it differently.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,86 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Deleted Code - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Conditionals.html#Conditionals" title="Conditionals">
|
||||
<link rel="prev" href="Conditional-Syntax.html#Conditional-Syntax" title="Conditional Syntax">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Deleted-Code"></a>
|
||||
<p>
|
||||
Previous: <a rel="previous" accesskey="p" href="Conditional-Syntax.html#Conditional-Syntax">Conditional Syntax</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Conditionals.html#Conditionals">Conditionals</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">4.3 Deleted Code</h3>
|
||||
|
||||
<p><a name="index-commenting-out-code-92"></a>
|
||||
If you replace or delete a part of the program but want to keep the old
|
||||
code around for future reference, you often cannot simply comment it
|
||||
out. Block comments do not nest, so the first comment inside the old
|
||||
code will end the commenting-out. The probable result is a flood of
|
||||
syntax errors.
|
||||
|
||||
<p>One way to avoid this problem is to use an always-false conditional
|
||||
instead. For instance, put <code>#if 0</code> before the deleted code and
|
||||
<code>#endif</code> after it. This works even if the code being turned
|
||||
off contains conditionals, but they must be entire conditionals
|
||||
(balanced ‘<samp><span class="samp">#if</span></samp>’ and ‘<samp><span class="samp">#endif</span></samp>’).
|
||||
|
||||
<p>Some people use <code>#ifdef notdef</code> instead. This is risky, because
|
||||
<code>notdef</code> might be accidentally defined as a macro, and then the
|
||||
conditional would succeed. <code>#if 0</code> can be counted on to fail.
|
||||
|
||||
<p>Do not use <code>#if 0</code> for comments which are not C code. Use a real
|
||||
comment, instead. The interior of <code>#if 0</code> must consist of complete
|
||||
tokens; in particular, single-quote characters must balance. Comments
|
||||
often contain unbalanced single-quote characters (known in English as
|
||||
apostrophes). These confuse <code>#if 0</code>. They don't confuse
|
||||
‘<samp><span class="samp">/*</span></samp>’.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,98 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Diagnostics - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="Conditionals.html#Conditionals" title="Conditionals">
|
||||
<link rel="next" href="Line-Control.html#Line-Control" title="Line Control">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Diagnostics"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Line-Control.html#Line-Control">Line Control</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Conditionals.html#Conditionals">Conditionals</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="chapter">5 Diagnostics</h2>
|
||||
|
||||
<p><a name="index-diagnostic-93"></a><a name="index-reporting-errors-94"></a><a name="index-reporting-warnings-95"></a>
|
||||
<a name="index-g_t_0023error-96"></a>The directive ‘<samp><span class="samp">#error</span></samp>’ causes the preprocessor to report a fatal
|
||||
error. The tokens forming the rest of the line following ‘<samp><span class="samp">#error</span></samp>’
|
||||
are used as the error message.
|
||||
|
||||
<p>You would use ‘<samp><span class="samp">#error</span></samp>’ inside of a conditional that detects a
|
||||
combination of parameters which you know the program does not properly
|
||||
support. For example, if you know that the program will not run
|
||||
properly on a VAX, you might write
|
||||
|
||||
<pre class="smallexample"> #ifdef __vax__
|
||||
#error "Won't work on VAXen. See comments at get_last_object."
|
||||
#endif
|
||||
</pre>
|
||||
<p>If you have several configuration parameters that must be set up by
|
||||
the installation in a consistent way, you can use conditionals to detect
|
||||
an inconsistency and report it with ‘<samp><span class="samp">#error</span></samp>’. For example,
|
||||
|
||||
<pre class="smallexample"> #if !defined(UNALIGNED_INT_ASM_OP) && defined(DWARF2_DEBUGGING_INFO)
|
||||
#error "DWARF2_DEBUGGING_INFO requires UNALIGNED_INT_ASM_OP."
|
||||
#endif
|
||||
</pre>
|
||||
<p><a name="index-g_t_0023warning-97"></a>The directive ‘<samp><span class="samp">#warning</span></samp>’ is like ‘<samp><span class="samp">#error</span></samp>’, but causes the
|
||||
preprocessor to issue a warning and continue preprocessing. The tokens
|
||||
following ‘<samp><span class="samp">#warning</span></samp>’ are used as the warning message.
|
||||
|
||||
<p>You might use ‘<samp><span class="samp">#warning</span></samp>’ in obsolete header files, with a message
|
||||
directing the user to the header file which should be used instead.
|
||||
|
||||
<p>Neither ‘<samp><span class="samp">#error</span></samp>’ nor ‘<samp><span class="samp">#warning</span></samp>’ macro-expands its argument.
|
||||
Internal whitespace sequences are each replaced with a single space.
|
||||
The line must consist of complete tokens. It is wisest to make the
|
||||
argument of these directives be a single string constant; this avoids
|
||||
problems with apostrophes and the like.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,148 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Differences from previous versions - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Implementation-Details.html#Implementation-Details" title="Implementation Details">
|
||||
<link rel="prev" href="Obsolete-Features.html#Obsolete-Features" title="Obsolete Features">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Differences-from-previous-versions"></a>
|
||||
<p>
|
||||
Previous: <a rel="previous" accesskey="p" href="Obsolete-Features.html#Obsolete-Features">Obsolete Features</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Implementation-Details.html#Implementation-Details">Implementation Details</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">11.4 Differences from previous versions</h3>
|
||||
|
||||
<p><a name="index-differences-from-previous-versions-117"></a>
|
||||
This section details behavior which has changed from previous versions
|
||||
of CPP. We do not plan to change it again in the near future, but
|
||||
we do not promise not to, either.
|
||||
|
||||
<p>The “previous versions” discussed here are 2.95 and before. The
|
||||
behavior of GCC 3.0 is mostly the same as the behavior of the widely
|
||||
used 2.96 and 2.97 development snapshots. Where there are differences,
|
||||
they generally represent bugs in the snapshots.
|
||||
|
||||
<ul>
|
||||
<li>-I- deprecated
|
||||
|
||||
<p>This option has been deprecated in 4.0. <samp><span class="option">-iquote</span></samp> is meant to
|
||||
replace the need for this option.
|
||||
|
||||
<li>Order of evaluation of ‘<samp><span class="samp">#</span></samp>’ and ‘<samp><span class="samp">##</span></samp>’ operators
|
||||
|
||||
<p>The standard does not specify the order of evaluation of a chain of
|
||||
‘<samp><span class="samp">##</span></samp>’ operators, nor whether ‘<samp><span class="samp">#</span></samp>’ is evaluated before, after, or
|
||||
at the same time as ‘<samp><span class="samp">##</span></samp>’. You should therefore not write any code
|
||||
which depends on any specific ordering. It is possible to guarantee an
|
||||
ordering, if you need one, by suitable use of nested macros.
|
||||
|
||||
<p>An example of where this might matter is pasting the arguments ‘<samp><span class="samp">1</span></samp>’,
|
||||
‘<samp><span class="samp">e</span></samp>’ and ‘<samp><span class="samp">-2</span></samp>’. This would be fine for left-to-right pasting,
|
||||
but right-to-left pasting would produce an invalid token ‘<samp><span class="samp">e-2</span></samp>’.
|
||||
|
||||
<p>GCC 3.0 evaluates ‘<samp><span class="samp">#</span></samp>’ and ‘<samp><span class="samp">##</span></samp>’ at the same time and strictly
|
||||
left to right. Older versions evaluated all ‘<samp><span class="samp">#</span></samp>’ operators first,
|
||||
then all ‘<samp><span class="samp">##</span></samp>’ operators, in an unreliable order.
|
||||
|
||||
<li>The form of whitespace between tokens in preprocessor output
|
||||
|
||||
<p>See <a href="Preprocessor-Output.html#Preprocessor-Output">Preprocessor Output</a>, for the current textual format. This is
|
||||
also the format used by stringification. Normally, the preprocessor
|
||||
communicates tokens directly to the compiler's parser, and whitespace
|
||||
does not come up at all.
|
||||
|
||||
<p>Older versions of GCC preserved all whitespace provided by the user and
|
||||
inserted lots more whitespace of their own, because they could not
|
||||
accurately predict when extra spaces were needed to prevent accidental
|
||||
token pasting.
|
||||
|
||||
<li>Optional argument when invoking rest argument macros
|
||||
|
||||
<p>As an extension, GCC permits you to omit the variable arguments entirely
|
||||
when you use a variable argument macro. This is forbidden by the 1999 C
|
||||
standard, and will provoke a pedantic warning with GCC 3.0. Previous
|
||||
versions accepted it silently.
|
||||
|
||||
<li>‘<samp><span class="samp">##</span></samp>’ swallowing preceding text in rest argument macros
|
||||
|
||||
<p>Formerly, in a macro expansion, if ‘<samp><span class="samp">##</span></samp>’ appeared before a variable
|
||||
arguments parameter, and the set of tokens specified for that argument
|
||||
in the macro invocation was empty, previous versions of CPP would
|
||||
back up and remove the preceding sequence of non-whitespace characters
|
||||
(<strong>not</strong> the preceding token). This extension is in direct
|
||||
conflict with the 1999 C standard and has been drastically pared back.
|
||||
|
||||
<p>In the current version of the preprocessor, if ‘<samp><span class="samp">##</span></samp>’ appears between
|
||||
a comma and a variable arguments parameter, and the variable argument is
|
||||
omitted entirely, the comma will be removed from the expansion. If the
|
||||
variable argument is empty, or the token before ‘<samp><span class="samp">##</span></samp>’ is not a
|
||||
comma, then ‘<samp><span class="samp">##</span></samp>’ behaves as a normal token paste.
|
||||
|
||||
<li>‘<samp><span class="samp">#line</span></samp>’ and ‘<samp><span class="samp">#include</span></samp>’
|
||||
|
||||
<p>The ‘<samp><span class="samp">#line</span></samp>’ directive used to change GCC's notion of the
|
||||
“directory containing the current file”, used by ‘<samp><span class="samp">#include</span></samp>’ with
|
||||
a double-quoted header file name. In 3.0 and later, it does not.
|
||||
See <a href="Line-Control.html#Line-Control">Line Control</a>, for further explanation.
|
||||
|
||||
<li>Syntax of ‘<samp><span class="samp">#line</span></samp>’
|
||||
|
||||
<p>In GCC 2.95 and previous, the string constant argument to ‘<samp><span class="samp">#line</span></samp>’
|
||||
was treated the same way as the argument to ‘<samp><span class="samp">#include</span></samp>’: backslash
|
||||
escapes were not honored, and the string ended at the second ‘<samp><span class="samp">"</span></samp>’.
|
||||
This is not compliant with the C standard. In GCC 3.0, an attempt was
|
||||
made to correct the behavior, so that the string was treated as a real
|
||||
string constant, but it turned out to be buggy. In 3.1, the bugs have
|
||||
been fixed. (We are not fixing the bugs in 3.0 because they affect
|
||||
relatively few people and the fix is quite invasive.)
|
||||
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,99 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Directives Within Macro Arguments - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macros.html#Macros" title="Macros">
|
||||
<link rel="prev" href="Undefining-and-Redefining-Macros.html#Undefining-and-Redefining-Macros" title="Undefining and Redefining Macros">
|
||||
<link rel="next" href="Macro-Pitfalls.html#Macro-Pitfalls" title="Macro Pitfalls">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Directives-Within-Macro-Arguments"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Macro-Pitfalls.html#Macro-Pitfalls">Macro Pitfalls</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Undefining-and-Redefining-Macros.html#Undefining-and-Redefining-Macros">Undefining and Redefining Macros</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macros.html#Macros">Macros</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">3.9 Directives Within Macro Arguments</h3>
|
||||
|
||||
<p><a name="index-macro-arguments-and-directives-71"></a>
|
||||
Occasionally it is convenient to use preprocessor directives within
|
||||
the arguments of a macro. The C and C++ standards declare that
|
||||
behavior in these cases is undefined.
|
||||
|
||||
<p>Versions of CPP prior to 3.2 would reject such constructs with an
|
||||
error message. This was the only syntactic difference between normal
|
||||
functions and function-like macros, so it seemed attractive to remove
|
||||
this limitation, and people would often be surprised that they could
|
||||
not use macros in this way. Moreover, sometimes people would use
|
||||
conditional compilation in the argument list to a normal library
|
||||
function like ‘<samp><span class="samp">printf</span></samp>’, only to find that after a library upgrade
|
||||
‘<samp><span class="samp">printf</span></samp>’ had changed to be a function-like macro, and their code
|
||||
would no longer compile. So from version 3.2 we changed CPP to
|
||||
successfully process arbitrary directives within macro arguments in
|
||||
exactly the same way as it would have processed the directive were the
|
||||
function-like macro invocation not present.
|
||||
|
||||
<p>If, within a macro invocation, that macro is redefined, then the new
|
||||
definition takes effect in time for argument pre-expansion, but the
|
||||
original definition is still used for argument replacement. Here is a
|
||||
pathological example:
|
||||
|
||||
<pre class="smallexample"> #define f(x) x x
|
||||
f (1
|
||||
#undef f
|
||||
#define f 2
|
||||
f)
|
||||
</pre>
|
||||
<p class="noindent">which expands to
|
||||
|
||||
<pre class="smallexample"> 1 2 1 2
|
||||
</pre>
|
||||
<p class="noindent">with the semantics described above.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,118 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Duplication of Side Effects - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macro-Pitfalls.html#Macro-Pitfalls" title="Macro Pitfalls">
|
||||
<link rel="prev" href="Swallowing-the-Semicolon.html#Swallowing-the-Semicolon" title="Swallowing the Semicolon">
|
||||
<link rel="next" href="Self_002dReferential-Macros.html#Self_002dReferential-Macros" title="Self-Referential Macros">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Duplication-of-Side-Effects"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Self_002dReferential-Macros.html#Self_002dReferential-Macros">Self-Referential Macros</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Swallowing-the-Semicolon.html#Swallowing-the-Semicolon">Swallowing the Semicolon</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macro-Pitfalls.html#Macro-Pitfalls">Macro Pitfalls</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h4 class="subsection">3.10.4 Duplication of Side Effects</h4>
|
||||
|
||||
<p><a name="index-side-effects-_0028in-macro-arguments_0029-76"></a><a name="index-unsafe-macros-77"></a>Many C programs define a macro <code>min</code>, for “minimum”, like this:
|
||||
|
||||
<pre class="smallexample"> #define min(X, Y) ((X) < (Y) ? (X) : (Y))
|
||||
</pre>
|
||||
<p>When you use this macro with an argument containing a side effect,
|
||||
as shown here,
|
||||
|
||||
<pre class="smallexample"> next = min (x + y, foo (z));
|
||||
</pre>
|
||||
<p class="noindent">it expands as follows:
|
||||
|
||||
<pre class="smallexample"> next = ((x + y) < (foo (z)) ? (x + y) : (foo (z)));
|
||||
</pre>
|
||||
<p class="noindent">where <code>x + y</code> has been substituted for <code>X</code> and <code>foo (z)</code>
|
||||
for <code>Y</code>.
|
||||
|
||||
<p>The function <code>foo</code> is used only once in the statement as it appears
|
||||
in the program, but the expression <code>foo (z)</code> has been substituted
|
||||
twice into the macro expansion. As a result, <code>foo</code> might be called
|
||||
two times when the statement is executed. If it has side effects or if
|
||||
it takes a long time to compute, the results might not be what you
|
||||
intended. We say that <code>min</code> is an <dfn>unsafe</dfn> macro.
|
||||
|
||||
<p>The best solution to this problem is to define <code>min</code> in a way that
|
||||
computes the value of <code>foo (z)</code> only once. The C language offers
|
||||
no standard way to do this, but it can be done with GNU extensions as
|
||||
follows:
|
||||
|
||||
<pre class="smallexample"> #define min(X, Y) \
|
||||
({ typeof (X) x_ = (X); \
|
||||
typeof (Y) y_ = (Y); \
|
||||
(x_ < y_) ? x_ : y_; })
|
||||
</pre>
|
||||
<p>The ‘<samp><span class="samp">({ ... })</span></samp>’ notation produces a compound statement that
|
||||
acts as an expression. Its value is the value of its last statement.
|
||||
This permits us to define local variables and assign each argument to
|
||||
one. The local variables have underscores after their names to reduce
|
||||
the risk of conflict with an identifier of wider scope (it is impossible
|
||||
to avoid this entirely). Now each argument is evaluated exactly once.
|
||||
|
||||
<p>If you do not wish to use GNU C extensions, the only solution is to be
|
||||
careful when <em>using</em> the macro <code>min</code>. For example, you can
|
||||
calculate the value of <code>foo (z)</code>, save it in a variable, and use
|
||||
that variable in <code>min</code>:
|
||||
|
||||
<pre class="smallexample"> #define min(X, Y) ((X) < (Y) ? (X) : (Y))
|
||||
...
|
||||
{
|
||||
int tem = foo (z);
|
||||
next = min (x + y, tem);
|
||||
}
|
||||
</pre>
|
||||
<p class="noindent">(where we assume that <code>foo</code> returns type <code>int</code>).
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,101 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Elif - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Conditional-Syntax.html#Conditional-Syntax" title="Conditional Syntax">
|
||||
<link rel="prev" href="Else.html#Else" title="Else">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Elif"></a>
|
||||
<p>
|
||||
Previous: <a rel="previous" accesskey="p" href="Else.html#Else">Else</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Conditional-Syntax.html#Conditional-Syntax">Conditional Syntax</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h4 class="subsection">4.2.5 Elif</h4>
|
||||
|
||||
<p><a name="index-g_t_0023elif-91"></a>One common case of nested conditionals is used to check for more than two
|
||||
possible alternatives. For example, you might have
|
||||
|
||||
<pre class="smallexample"> #if X == 1
|
||||
...
|
||||
#else /* X != 1 */
|
||||
#if X == 2
|
||||
...
|
||||
#else /* X != 2 */
|
||||
...
|
||||
#endif /* X != 2 */
|
||||
#endif /* X != 1 */
|
||||
</pre>
|
||||
<p>Another conditional directive, ‘<samp><span class="samp">#elif</span></samp>’, allows this to be
|
||||
abbreviated as follows:
|
||||
|
||||
<pre class="smallexample"> #if X == 1
|
||||
...
|
||||
#elif X == 2
|
||||
...
|
||||
#else /* X != 2 and X != 1*/
|
||||
...
|
||||
#endif /* X != 2 and X != 1*/
|
||||
</pre>
|
||||
<p>‘<samp><span class="samp">#elif</span></samp>’ stands for “else if”. Like ‘<samp><span class="samp">#else</span></samp>’, it goes in the
|
||||
middle of a conditional group and subdivides it; it does not require a
|
||||
matching ‘<samp><span class="samp">#endif</span></samp>’ of its own. Like ‘<samp><span class="samp">#if</span></samp>’, the ‘<samp><span class="samp">#elif</span></samp>’
|
||||
directive includes an expression to be tested. The text following the
|
||||
‘<samp><span class="samp">#elif</span></samp>’ is processed only if the original ‘<samp><span class="samp">#if</span></samp>’-condition
|
||||
failed and the ‘<samp><span class="samp">#elif</span></samp>’ condition succeeds.
|
||||
|
||||
<p>More than one ‘<samp><span class="samp">#elif</span></samp>’ can go in the same conditional group. Then
|
||||
the text after each ‘<samp><span class="samp">#elif</span></samp>’ is processed only if the ‘<samp><span class="samp">#elif</span></samp>’
|
||||
condition succeeds after the original ‘<samp><span class="samp">#if</span></samp>’ and all previous
|
||||
‘<samp><span class="samp">#elif</span></samp>’ directives within it have failed.
|
||||
|
||||
<p>‘<samp><span class="samp">#else</span></samp>’ is allowed after any number of ‘<samp><span class="samp">#elif</span></samp>’ directives, but
|
||||
‘<samp><span class="samp">#elif</span></samp>’ may not follow ‘<samp><span class="samp">#else</span></samp>’.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,80 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Else - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Conditional-Syntax.html#Conditional-Syntax" title="Conditional Syntax">
|
||||
<link rel="prev" href="Defined.html#Defined" title="Defined">
|
||||
<link rel="next" href="Elif.html#Elif" title="Elif">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Else"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Elif.html#Elif">Elif</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Defined.html#Defined">Defined</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Conditional-Syntax.html#Conditional-Syntax">Conditional Syntax</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h4 class="subsection">4.2.4 Else</h4>
|
||||
|
||||
<p><a name="index-g_t_0023else-90"></a>The ‘<samp><span class="samp">#else</span></samp>’ directive can be added to a conditional to provide
|
||||
alternative text to be used if the condition fails. This is what it
|
||||
looks like:
|
||||
|
||||
<pre class="smallexample"> #if <var>expression</var>
|
||||
<var>text-if-true</var>
|
||||
#else /* Not <var>expression</var> */
|
||||
<var>text-if-false</var>
|
||||
#endif /* Not <var>expression</var> */
|
||||
</pre>
|
||||
<p class="noindent">If <var>expression</var> is nonzero, the <var>text-if-true</var> is included and
|
||||
the <var>text-if-false</var> is skipped. If <var>expression</var> is zero, the
|
||||
opposite happens.
|
||||
|
||||
<p>You can use ‘<samp><span class="samp">#else</span></samp>’ with ‘<samp><span class="samp">#ifdef</span></samp>’ and ‘<samp><span class="samp">#ifndef</span></samp>’, too.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,139 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Environment Variables - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="Invocation.html#Invocation" title="Invocation">
|
||||
<link rel="next" href="GNU-Free-Documentation-License.html#GNU-Free-Documentation-License" title="GNU Free Documentation License">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Environment-Variables"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="GNU-Free-Documentation-License.html#GNU-Free-Documentation-License">GNU Free Documentation License</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Invocation.html#Invocation">Invocation</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="chapter">13 Environment Variables</h2>
|
||||
|
||||
<p><a name="index-environment-variables-198"></a><!-- man begin ENVIRONMENT -->
|
||||
|
||||
<p>This section describes the environment variables that affect how CPP
|
||||
operates. You can use them to specify directories or prefixes to use
|
||||
when searching for include files, or to control dependency output.
|
||||
|
||||
<p>Note that you can also specify places to search using options such as
|
||||
<samp><span class="option">-I</span></samp>, and control dependency output with options like
|
||||
<samp><span class="option">-M</span></samp> (see <a href="Invocation.html#Invocation">Invocation</a>). These take precedence over
|
||||
environment variables, which in turn take precedence over the
|
||||
configuration of GCC.
|
||||
|
||||
<!-- Copyright (c) 1999, 2000, 2001, 2002, 2004 -->
|
||||
<!-- Free Software Foundation, Inc. -->
|
||||
<!-- This is part of the CPP and GCC manuals. -->
|
||||
<!-- For copying conditions, see the file gcc.texi. -->
|
||||
<!-- -->
|
||||
<!-- Environment variables affecting the preprocessor -->
|
||||
<!-- -->
|
||||
<!-- If this file is included with the flag ``cppmanual'' set, it is -->
|
||||
<!-- formatted for inclusion in the CPP manual; otherwise the main GCC manual. -->
|
||||
<dl>
|
||||
<dt><samp><span class="env">CPATH</span></samp><a name="index-CPATH-199"></a><dt><samp><span class="env">C_INCLUDE_PATH</span></samp><a name="index-C_005fINCLUDE_005fPATH-200"></a><dt><samp><span class="env">CPLUS_INCLUDE_PATH</span></samp><a name="index-CPLUS_005fINCLUDE_005fPATH-201"></a><dt><samp><span class="env">OBJC_INCLUDE_PATH</span></samp><a name="index-OBJC_005fINCLUDE_005fPATH-202"></a><dd><!-- Commented out until ObjC++ is part of GCC: -->
|
||||
<!-- @itemx OBJCPLUS_INCLUDE_PATH -->
|
||||
Each variable's value is a list of directories separated by a special
|
||||
character, much like <samp><span class="env">PATH</span></samp>, in which to look for header files.
|
||||
The special character, <code>PATH_SEPARATOR</code>, is target-dependent and
|
||||
determined at GCC build time. For Microsoft Windows-based targets it is a
|
||||
semicolon, and for almost all other targets it is a colon.
|
||||
|
||||
<p><samp><span class="env">CPATH</span></samp> specifies a list of directories to be searched as if
|
||||
specified with <samp><span class="option">-I</span></samp>, but after any paths given with <samp><span class="option">-I</span></samp>
|
||||
options on the command line. This environment variable is used
|
||||
regardless of which language is being preprocessed.
|
||||
|
||||
<p>The remaining environment variables apply only when preprocessing the
|
||||
particular language indicated. Each specifies a list of directories
|
||||
to be searched as if specified with <samp><span class="option">-isystem</span></samp>, but after any
|
||||
paths given with <samp><span class="option">-isystem</span></samp> options on the command line.
|
||||
|
||||
<p>In all these variables, an empty element instructs the compiler to
|
||||
search its current working directory. Empty elements can appear at the
|
||||
beginning or end of a path. For instance, if the value of
|
||||
<samp><span class="env">CPATH</span></samp> is <code>:/special/include</code>, that has the same
|
||||
effect as ‘<samp><span class="samp">-I. -I/special/include<!-- /@w --></span></samp>’.
|
||||
|
||||
<!-- man end -->
|
||||
<p>See also <a href="Search-Path.html#Search-Path">Search Path</a>.
|
||||
<!-- man begin ENVIRONMENT -->
|
||||
|
||||
<br><dt><samp><span class="env">DEPENDENCIES_OUTPUT</span></samp><a name="index-DEPENDENCIES_005fOUTPUT-203"></a><dd><a name="index-dependencies-for-make-as-output-204"></a>If this variable is set, its value specifies how to output
|
||||
dependencies for Make based on the non-system header files processed
|
||||
by the compiler. System header files are ignored in the dependency
|
||||
output.
|
||||
|
||||
<p>The value of <samp><span class="env">DEPENDENCIES_OUTPUT</span></samp> can be just a file name, in
|
||||
which case the Make rules are written to that file, guessing the target
|
||||
name from the source file name. Or the value can have the form
|
||||
‘<samp><var>file</var> <var>target</var></samp>’, in which case the rules are written to
|
||||
file <var>file</var> using <var>target</var> as the target name.
|
||||
|
||||
<p>In other words, this environment variable is equivalent to combining
|
||||
the options <samp><span class="option">-MM</span></samp> and <samp><span class="option">-MF</span></samp>
|
||||
(see <a href="Invocation.html#Invocation">Invocation</a>),
|
||||
with an optional <samp><span class="option">-MT</span></samp> switch too.
|
||||
|
||||
<br><dt><samp><span class="env">SUNPRO_DEPENDENCIES</span></samp><a name="index-SUNPRO_005fDEPENDENCIES-205"></a><dd><a name="index-dependencies-for-make-as-output-206"></a>This variable is the same as <samp><span class="env">DEPENDENCIES_OUTPUT</span></samp> (see above),
|
||||
except that system header files are not ignored, so it implies
|
||||
<samp><span class="option">-M</span></samp> rather than <samp><span class="option">-MM</span></samp>. However, the dependence on the
|
||||
main input file is omitted.
|
||||
See <a href="Invocation.html#Invocation">Invocation</a>.
|
||||
</dl>
|
||||
<!-- man end -->
|
||||
|
||||
<!-- Special handling for inclusion in the install manual. -->
|
||||
<!-- man begin DESCRIPTION -->
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,104 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Function-like Macros - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macros.html#Macros" title="Macros">
|
||||
<link rel="prev" href="Object_002dlike-Macros.html#Object_002dlike-Macros" title="Object-like Macros">
|
||||
<link rel="next" href="Macro-Arguments.html#Macro-Arguments" title="Macro Arguments">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Function-like-Macros"></a>
|
||||
<a name="Function_002dlike-Macros"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Macro-Arguments.html#Macro-Arguments">Macro Arguments</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Object_002dlike-Macros.html#Object_002dlike-Macros">Object-like Macros</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macros.html#Macros">Macros</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">3.2 Function-like Macros</h3>
|
||||
|
||||
<p><a name="index-function_002dlike-macros-45"></a>
|
||||
You can also define macros whose use looks like a function call. These
|
||||
are called <dfn>function-like macros</dfn>. To define a function-like macro,
|
||||
you use the same ‘<samp><span class="samp">#define</span></samp>’ directive, but you put a pair of
|
||||
parentheses immediately after the macro name. For example,
|
||||
|
||||
<pre class="smallexample"> #define lang_init() c_init()
|
||||
lang_init()
|
||||
==> c_init()
|
||||
</pre>
|
||||
<p>A function-like macro is only expanded if its name appears with a pair
|
||||
of parentheses after it. If you write just the name, it is left alone.
|
||||
This can be useful when you have a function and a macro of the same
|
||||
name, and you wish to use the function sometimes.
|
||||
|
||||
<pre class="smallexample"> extern void foo(void);
|
||||
#define foo() /* <span class="roman">optimized inline version</span> */
|
||||
...
|
||||
foo();
|
||||
funcptr = foo;
|
||||
</pre>
|
||||
<p>Here the call to <code>foo()</code> will use the macro, but the function
|
||||
pointer will get the address of the real function. If the macro were to
|
||||
be expanded, it would cause a syntax error.
|
||||
|
||||
<p>If you put spaces between the macro name and the parentheses in the
|
||||
macro definition, that does not define a function-like macro, it defines
|
||||
an object-like macro whose expansion happens to begin with a pair of
|
||||
parentheses.
|
||||
|
||||
<pre class="smallexample"> #define lang_init () c_init()
|
||||
lang_init()
|
||||
==> () c_init()()
|
||||
</pre>
|
||||
<p>The first two pairs of parentheses in this expansion come from the
|
||||
macro. The third is the pair that was originally after the macro
|
||||
invocation. Since <code>lang_init</code> is an object-like macro, it does not
|
||||
consume those parentheses.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,473 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>GNU Free Documentation License - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="Environment-Variables.html#Environment-Variables" title="Environment Variables">
|
||||
<link rel="next" href="Index-of-Directives.html#Index-of-Directives" title="Index of Directives">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="GNU-Free-Documentation-License"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Index-of-Directives.html#Index-of-Directives">Index of Directives</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Environment-Variables.html#Environment-Variables">Environment Variables</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="unnumbered">GNU Free Documentation License</h2>
|
||||
|
||||
<p><a name="index-FDL_002c-GNU-Free-Documentation-License-207"></a><div align="center">Version 1.2, November 2002</div>
|
||||
|
||||
<pre class="display"> Copyright © 2000,2001,2002 Free Software Foundation, Inc.
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
</pre>
|
||||
<ol type=1 start=0>
|
||||
<li>PREAMBLE
|
||||
|
||||
<p>The purpose of this License is to make a manual, textbook, or other
|
||||
functional and useful document <dfn>free</dfn> in the sense of freedom: to
|
||||
assure everyone the effective freedom to copy and redistribute it,
|
||||
with or without modifying it, either commercially or noncommercially.
|
||||
Secondarily, this License preserves for the author and publisher a way
|
||||
to get credit for their work, while not being considered responsible
|
||||
for modifications made by others.
|
||||
|
||||
<p>This License is a kind of “copyleft”, which means that derivative
|
||||
works of the document must themselves be free in the same sense. It
|
||||
complements the GNU General Public License, which is a copyleft
|
||||
license designed for free software.
|
||||
|
||||
<p>We have designed this License in order to use it for manuals for free
|
||||
software, because free software needs free documentation: a free
|
||||
program should come with manuals providing the same freedoms that the
|
||||
software does. But this License is not limited to software manuals;
|
||||
it can be used for any textual work, regardless of subject matter or
|
||||
whether it is published as a printed book. We recommend this License
|
||||
principally for works whose purpose is instruction or reference.
|
||||
|
||||
<li>APPLICABILITY AND DEFINITIONS
|
||||
|
||||
<p>This License applies to any manual or other work, in any medium, that
|
||||
contains a notice placed by the copyright holder saying it can be
|
||||
distributed under the terms of this License. Such a notice grants a
|
||||
world-wide, royalty-free license, unlimited in duration, to use that
|
||||
work under the conditions stated herein. The “Document”, below,
|
||||
refers to any such manual or work. Any member of the public is a
|
||||
licensee, and is addressed as “you”. You accept the license if you
|
||||
copy, modify or distribute the work in a way requiring permission
|
||||
under copyright law.
|
||||
|
||||
<p>A “Modified Version” of the Document means any work containing the
|
||||
Document or a portion of it, either copied verbatim, or with
|
||||
modifications and/or translated into another language.
|
||||
|
||||
<p>A “Secondary Section” is a named appendix or a front-matter section
|
||||
of the Document that deals exclusively with the relationship of the
|
||||
publishers or authors of the Document to the Document's overall
|
||||
subject (or to related matters) and contains nothing that could fall
|
||||
directly within that overall subject. (Thus, if the Document is in
|
||||
part a textbook of mathematics, a Secondary Section may not explain
|
||||
any mathematics.) The relationship could be a matter of historical
|
||||
connection with the subject or with related matters, or of legal,
|
||||
commercial, philosophical, ethical or political position regarding
|
||||
them.
|
||||
|
||||
<p>The “Invariant Sections” are certain Secondary Sections whose titles
|
||||
are designated, as being those of Invariant Sections, in the notice
|
||||
that says that the Document is released under this License. If a
|
||||
section does not fit the above definition of Secondary then it is not
|
||||
allowed to be designated as Invariant. The Document may contain zero
|
||||
Invariant Sections. If the Document does not identify any Invariant
|
||||
Sections then there are none.
|
||||
|
||||
<p>The “Cover Texts” are certain short passages of text that are listed,
|
||||
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
|
||||
the Document is released under this License. A Front-Cover Text may
|
||||
be at most 5 words, and a Back-Cover Text may be at most 25 words.
|
||||
|
||||
<p>A “Transparent” copy of the Document means a machine-readable copy,
|
||||
represented in a format whose specification is available to the
|
||||
general public, that is suitable for revising the document
|
||||
straightforwardly with generic text editors or (for images composed of
|
||||
pixels) generic paint programs or (for drawings) some widely available
|
||||
drawing editor, and that is suitable for input to text formatters or
|
||||
for automatic translation to a variety of formats suitable for input
|
||||
to text formatters. A copy made in an otherwise Transparent file
|
||||
format whose markup, or absence of markup, has been arranged to thwart
|
||||
or discourage subsequent modification by readers is not Transparent.
|
||||
An image format is not Transparent if used for any substantial amount
|
||||
of text. A copy that is not “Transparent” is called “Opaque”.
|
||||
|
||||
<p>Examples of suitable formats for Transparent copies include plain
|
||||
<span class="sc">ascii</span> without markup, Texinfo input format, LaTeX input
|
||||
format, <acronym>SGML</acronym> or <acronym>XML</acronym> using a publicly available
|
||||
<acronym>DTD</acronym>, and standard-conforming simple <acronym>HTML</acronym>,
|
||||
PostScript or <acronym>PDF</acronym> designed for human modification. Examples
|
||||
of transparent image formats include <acronym>PNG</acronym>, <acronym>XCF</acronym> and
|
||||
<acronym>JPG</acronym>. Opaque formats include proprietary formats that can be
|
||||
read and edited only by proprietary word processors, <acronym>SGML</acronym> or
|
||||
<acronym>XML</acronym> for which the <acronym>DTD</acronym> and/or processing tools are
|
||||
not generally available, and the machine-generated <acronym>HTML</acronym>,
|
||||
PostScript or <acronym>PDF</acronym> produced by some word processors for
|
||||
output purposes only.
|
||||
|
||||
<p>The “Title Page” means, for a printed book, the title page itself,
|
||||
plus such following pages as are needed to hold, legibly, the material
|
||||
this License requires to appear in the title page. For works in
|
||||
formats which do not have any title page as such, “Title Page” means
|
||||
the text near the most prominent appearance of the work's title,
|
||||
preceding the beginning of the body of the text.
|
||||
|
||||
<p>A section “Entitled XYZ” means a named subunit of the Document whose
|
||||
title either is precisely XYZ or contains XYZ in parentheses following
|
||||
text that translates XYZ in another language. (Here XYZ stands for a
|
||||
specific section name mentioned below, such as “Acknowledgements”,
|
||||
“Dedications”, “Endorsements”, or “History”.) To “Preserve the Title”
|
||||
of such a section when you modify the Document means that it remains a
|
||||
section “Entitled XYZ” according to this definition.
|
||||
|
||||
<p>The Document may include Warranty Disclaimers next to the notice which
|
||||
states that this License applies to the Document. These Warranty
|
||||
Disclaimers are considered to be included by reference in this
|
||||
License, but only as regards disclaiming warranties: any other
|
||||
implication that these Warranty Disclaimers may have is void and has
|
||||
no effect on the meaning of this License.
|
||||
|
||||
<li>VERBATIM COPYING
|
||||
|
||||
<p>You may copy and distribute the Document in any medium, either
|
||||
commercially or noncommercially, provided that this License, the
|
||||
copyright notices, and the license notice saying this License applies
|
||||
to the Document are reproduced in all copies, and that you add no other
|
||||
conditions whatsoever to those of this License. You may not use
|
||||
technical measures to obstruct or control the reading or further
|
||||
copying of the copies you make or distribute. However, you may accept
|
||||
compensation in exchange for copies. If you distribute a large enough
|
||||
number of copies you must also follow the conditions in section 3.
|
||||
|
||||
<p>You may also lend copies, under the same conditions stated above, and
|
||||
you may publicly display copies.
|
||||
|
||||
<li>COPYING IN QUANTITY
|
||||
|
||||
<p>If you publish printed copies (or copies in media that commonly have
|
||||
printed covers) of the Document, numbering more than 100, and the
|
||||
Document's license notice requires Cover Texts, you must enclose the
|
||||
copies in covers that carry, clearly and legibly, all these Cover
|
||||
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
|
||||
the back cover. Both covers must also clearly and legibly identify
|
||||
you as the publisher of these copies. The front cover must present
|
||||
the full title with all words of the title equally prominent and
|
||||
visible. You may add other material on the covers in addition.
|
||||
Copying with changes limited to the covers, as long as they preserve
|
||||
the title of the Document and satisfy these conditions, can be treated
|
||||
as verbatim copying in other respects.
|
||||
|
||||
<p>If the required texts for either cover are too voluminous to fit
|
||||
legibly, you should put the first ones listed (as many as fit
|
||||
reasonably) on the actual cover, and continue the rest onto adjacent
|
||||
pages.
|
||||
|
||||
<p>If you publish or distribute Opaque copies of the Document numbering
|
||||
more than 100, you must either include a machine-readable Transparent
|
||||
copy along with each Opaque copy, or state in or with each Opaque copy
|
||||
a computer-network location from which the general network-using
|
||||
public has access to download using public-standard network protocols
|
||||
a complete Transparent copy of the Document, free of added material.
|
||||
If you use the latter option, you must take reasonably prudent steps,
|
||||
when you begin distribution of Opaque copies in quantity, to ensure
|
||||
that this Transparent copy will remain thus accessible at the stated
|
||||
location until at least one year after the last time you distribute an
|
||||
Opaque copy (directly or through your agents or retailers) of that
|
||||
edition to the public.
|
||||
|
||||
<p>It is requested, but not required, that you contact the authors of the
|
||||
Document well before redistributing any large number of copies, to give
|
||||
them a chance to provide you with an updated version of the Document.
|
||||
|
||||
<li>MODIFICATIONS
|
||||
|
||||
<p>You may copy and distribute a Modified Version of the Document under
|
||||
the conditions of sections 2 and 3 above, provided that you release
|
||||
the Modified Version under precisely this License, with the Modified
|
||||
Version filling the role of the Document, thus licensing distribution
|
||||
and modification of the Modified Version to whoever possesses a copy
|
||||
of it. In addition, you must do these things in the Modified Version:
|
||||
|
||||
<ol type=A start=1>
|
||||
<li>Use in the Title Page (and on the covers, if any) a title distinct
|
||||
from that of the Document, and from those of previous versions
|
||||
(which should, if there were any, be listed in the History section
|
||||
of the Document). You may use the same title as a previous version
|
||||
if the original publisher of that version gives permission.
|
||||
|
||||
<li>List on the Title Page, as authors, one or more persons or entities
|
||||
responsible for authorship of the modifications in the Modified
|
||||
Version, together with at least five of the principal authors of the
|
||||
Document (all of its principal authors, if it has fewer than five),
|
||||
unless they release you from this requirement.
|
||||
|
||||
<li>State on the Title page the name of the publisher of the
|
||||
Modified Version, as the publisher.
|
||||
|
||||
<li>Preserve all the copyright notices of the Document.
|
||||
|
||||
<li>Add an appropriate copyright notice for your modifications
|
||||
adjacent to the other copyright notices.
|
||||
|
||||
<li>Include, immediately after the copyright notices, a license notice
|
||||
giving the public permission to use the Modified Version under the
|
||||
terms of this License, in the form shown in the Addendum below.
|
||||
|
||||
<li>Preserve in that license notice the full lists of Invariant Sections
|
||||
and required Cover Texts given in the Document's license notice.
|
||||
|
||||
<li>Include an unaltered copy of this License.
|
||||
|
||||
<li>Preserve the section Entitled “History”, Preserve its Title, and add
|
||||
to it an item stating at least the title, year, new authors, and
|
||||
publisher of the Modified Version as given on the Title Page. If
|
||||
there is no section Entitled “History” in the Document, create one
|
||||
stating the title, year, authors, and publisher of the Document as
|
||||
given on its Title Page, then add an item describing the Modified
|
||||
Version as stated in the previous sentence.
|
||||
|
||||
<li>Preserve the network location, if any, given in the Document for
|
||||
public access to a Transparent copy of the Document, and likewise
|
||||
the network locations given in the Document for previous versions
|
||||
it was based on. These may be placed in the “History” section.
|
||||
You may omit a network location for a work that was published at
|
||||
least four years before the Document itself, or if the original
|
||||
publisher of the version it refers to gives permission.
|
||||
|
||||
<li>For any section Entitled “Acknowledgements” or “Dedications”, Preserve
|
||||
the Title of the section, and preserve in the section all the
|
||||
substance and tone of each of the contributor acknowledgements and/or
|
||||
dedications given therein.
|
||||
|
||||
<li>Preserve all the Invariant Sections of the Document,
|
||||
unaltered in their text and in their titles. Section numbers
|
||||
or the equivalent are not considered part of the section titles.
|
||||
|
||||
<li>Delete any section Entitled “Endorsements”. Such a section
|
||||
may not be included in the Modified Version.
|
||||
|
||||
<li>Do not retitle any existing section to be Entitled “Endorsements” or
|
||||
to conflict in title with any Invariant Section.
|
||||
|
||||
<li>Preserve any Warranty Disclaimers.
|
||||
</ol>
|
||||
|
||||
<p>If the Modified Version includes new front-matter sections or
|
||||
appendices that qualify as Secondary Sections and contain no material
|
||||
copied from the Document, you may at your option designate some or all
|
||||
of these sections as invariant. To do this, add their titles to the
|
||||
list of Invariant Sections in the Modified Version's license notice.
|
||||
These titles must be distinct from any other section titles.
|
||||
|
||||
<p>You may add a section Entitled “Endorsements”, provided it contains
|
||||
nothing but endorsements of your Modified Version by various
|
||||
parties—for example, statements of peer review or that the text has
|
||||
been approved by an organization as the authoritative definition of a
|
||||
standard.
|
||||
|
||||
<p>You may add a passage of up to five words as a Front-Cover Text, and a
|
||||
passage of up to 25 words as a Back-Cover Text, to the end of the list
|
||||
of Cover Texts in the Modified Version. Only one passage of
|
||||
Front-Cover Text and one of Back-Cover Text may be added by (or
|
||||
through arrangements made by) any one entity. If the Document already
|
||||
includes a cover text for the same cover, previously added by you or
|
||||
by arrangement made by the same entity you are acting on behalf of,
|
||||
you may not add another; but you may replace the old one, on explicit
|
||||
permission from the previous publisher that added the old one.
|
||||
|
||||
<p>The author(s) and publisher(s) of the Document do not by this License
|
||||
give permission to use their names for publicity for or to assert or
|
||||
imply endorsement of any Modified Version.
|
||||
|
||||
<li>COMBINING DOCUMENTS
|
||||
|
||||
<p>You may combine the Document with other documents released under this
|
||||
License, under the terms defined in section 4 above for modified
|
||||
versions, provided that you include in the combination all of the
|
||||
Invariant Sections of all of the original documents, unmodified, and
|
||||
list them all as Invariant Sections of your combined work in its
|
||||
license notice, and that you preserve all their Warranty Disclaimers.
|
||||
|
||||
<p>The combined work need only contain one copy of this License, and
|
||||
multiple identical Invariant Sections may be replaced with a single
|
||||
copy. If there are multiple Invariant Sections with the same name but
|
||||
different contents, make the title of each such section unique by
|
||||
adding at the end of it, in parentheses, the name of the original
|
||||
author or publisher of that section if known, or else a unique number.
|
||||
Make the same adjustment to the section titles in the list of
|
||||
Invariant Sections in the license notice of the combined work.
|
||||
|
||||
<p>In the combination, you must combine any sections Entitled “History”
|
||||
in the various original documents, forming one section Entitled
|
||||
“History”; likewise combine any sections Entitled “Acknowledgements”,
|
||||
and any sections Entitled “Dedications”. You must delete all
|
||||
sections Entitled “Endorsements.”
|
||||
|
||||
<li>COLLECTIONS OF DOCUMENTS
|
||||
|
||||
<p>You may make a collection consisting of the Document and other documents
|
||||
released under this License, and replace the individual copies of this
|
||||
License in the various documents with a single copy that is included in
|
||||
the collection, provided that you follow the rules of this License for
|
||||
verbatim copying of each of the documents in all other respects.
|
||||
|
||||
<p>You may extract a single document from such a collection, and distribute
|
||||
it individually under this License, provided you insert a copy of this
|
||||
License into the extracted document, and follow this License in all
|
||||
other respects regarding verbatim copying of that document.
|
||||
|
||||
<li>AGGREGATION WITH INDEPENDENT WORKS
|
||||
|
||||
<p>A compilation of the Document or its derivatives with other separate
|
||||
and independent documents or works, in or on a volume of a storage or
|
||||
distribution medium, is called an “aggregate” if the copyright
|
||||
resulting from the compilation is not used to limit the legal rights
|
||||
of the compilation's users beyond what the individual works permit.
|
||||
When the Document is included in an aggregate, this License does not
|
||||
apply to the other works in the aggregate which are not themselves
|
||||
derivative works of the Document.
|
||||
|
||||
<p>If the Cover Text requirement of section 3 is applicable to these
|
||||
copies of the Document, then if the Document is less than one half of
|
||||
the entire aggregate, the Document's Cover Texts may be placed on
|
||||
covers that bracket the Document within the aggregate, or the
|
||||
electronic equivalent of covers if the Document is in electronic form.
|
||||
Otherwise they must appear on printed covers that bracket the whole
|
||||
aggregate.
|
||||
|
||||
<li>TRANSLATION
|
||||
|
||||
<p>Translation is considered a kind of modification, so you may
|
||||
distribute translations of the Document under the terms of section 4.
|
||||
Replacing Invariant Sections with translations requires special
|
||||
permission from their copyright holders, but you may include
|
||||
translations of some or all Invariant Sections in addition to the
|
||||
original versions of these Invariant Sections. You may include a
|
||||
translation of this License, and all the license notices in the
|
||||
Document, and any Warranty Disclaimers, provided that you also include
|
||||
the original English version of this License and the original versions
|
||||
of those notices and disclaimers. In case of a disagreement between
|
||||
the translation and the original version of this License or a notice
|
||||
or disclaimer, the original version will prevail.
|
||||
|
||||
<p>If a section in the Document is Entitled “Acknowledgements”,
|
||||
“Dedications”, or “History”, the requirement (section 4) to Preserve
|
||||
its Title (section 1) will typically require changing the actual
|
||||
title.
|
||||
|
||||
<li>TERMINATION
|
||||
|
||||
<p>You may not copy, modify, sublicense, or distribute the Document except
|
||||
as expressly provided for under this License. Any other attempt to
|
||||
copy, modify, sublicense or distribute the Document is void, and will
|
||||
automatically terminate your rights under this License. However,
|
||||
parties who have received copies, or rights, from you under this
|
||||
License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
<li>FUTURE REVISIONS OF THIS LICENSE
|
||||
|
||||
<p>The Free Software Foundation may publish new, revised versions
|
||||
of the GNU Free Documentation License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns. See
|
||||
<a href="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</a>.
|
||||
|
||||
<p>Each version of the License is given a distinguishing version number.
|
||||
If the Document specifies that a particular numbered version of this
|
||||
License “or any later version” applies to it, you have the option of
|
||||
following the terms and conditions either of that specified version or
|
||||
of any later version that has been published (not as a draft) by the
|
||||
Free Software Foundation. If the Document does not specify a version
|
||||
number of this License, you may choose any version ever published (not
|
||||
as a draft) by the Free Software Foundation.
|
||||
</ol>
|
||||
|
||||
<h3 class="unnumberedsec">ADDENDUM: How to use this License for your documents</h3>
|
||||
|
||||
<p>To use this License in a document you have written, include a copy of
|
||||
the License in the document and put the following copyright and
|
||||
license notices just after the title page:
|
||||
|
||||
<pre class="smallexample"> Copyright (C) <var>year</var> <var>your name</var>.
|
||||
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 no Invariant Sections, no Front-Cover Texts, and no Back-Cover
|
||||
Texts. A copy of the license is included in the section entitled ``GNU
|
||||
Free Documentation License''.
|
||||
</pre>
|
||||
<p>If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
|
||||
replace the “with...Texts.” line with this:
|
||||
|
||||
<pre class="smallexample"> with the Invariant Sections being <var>list their titles</var>, with
|
||||
the Front-Cover Texts being <var>list</var>, and with the Back-Cover Texts
|
||||
being <var>list</var>.
|
||||
</pre>
|
||||
<p>If you have Invariant Sections without Cover Texts, or some other
|
||||
combination of the three, merge those two alternatives to suit the
|
||||
situation.
|
||||
|
||||
<p>If your document contains nontrivial examples of program code, we
|
||||
recommend releasing these examples in parallel under your choice of
|
||||
free software license, such as the GNU General Public License,
|
||||
to permit their use in free software.
|
||||
|
||||
<!-- Local Variables: -->
|
||||
<!-- ispell-local-pdict: "ispell-dict" -->
|
||||
<!-- End: -->
|
||||
<!-- man end -->
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,107 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Header Files - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="Overview.html#Overview" title="Overview">
|
||||
<link rel="next" href="Macros.html#Macros" title="Macros">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Header-Files"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Macros.html#Macros">Macros</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Overview.html#Overview">Overview</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="chapter">2 Header Files</h2>
|
||||
|
||||
<p><a name="index-header-file-25"></a>A header file is a file containing C declarations and macro definitions
|
||||
(see <a href="Macros.html#Macros">Macros</a>) to be shared between several source files. You request
|
||||
the use of a header file in your program by <dfn>including</dfn> it, with the
|
||||
C preprocessing directive ‘<samp><span class="samp">#include</span></samp>’.
|
||||
|
||||
<p>Header files serve two purposes.
|
||||
|
||||
<ul>
|
||||
<li><a name="index-system-header-files-26"></a>System header files declare the interfaces to parts of the operating
|
||||
system. You include them in your program to supply the definitions and
|
||||
declarations you need to invoke system calls and libraries.
|
||||
|
||||
<li>Your own header files contain declarations for interfaces between the
|
||||
source files of your program. Each time you have a group of related
|
||||
declarations and macro definitions all or most of which are needed in
|
||||
several different source files, it is a good idea to create a header
|
||||
file for them.
|
||||
</ul>
|
||||
|
||||
<p>Including a header file produces the same results as copying the header
|
||||
file into each source file that needs it. Such copying would be
|
||||
time-consuming and error-prone. With a header file, the related
|
||||
declarations appear in only one place. If they need to be changed, they
|
||||
can be changed in one place, and programs that include the header file
|
||||
will automatically use the new version when next recompiled. The header
|
||||
file eliminates the labor of finding and changing all the copies as well
|
||||
as the risk that a failure to find one copy will result in
|
||||
inconsistencies within a program.
|
||||
|
||||
<p>In C, the usual convention is to give header files names that end with
|
||||
<samp><span class="file">.h</span></samp>. It is most portable to use only letters, digits, dashes, and
|
||||
underscores in header file names, and at most one dot.
|
||||
|
||||
<ul class="menu">
|
||||
<li><a accesskey="1" href="Include-Syntax.html#Include-Syntax">Include Syntax</a>
|
||||
<li><a accesskey="2" href="Include-Operation.html#Include-Operation">Include Operation</a>
|
||||
<li><a accesskey="3" href="Search-Path.html#Search-Path">Search Path</a>
|
||||
<li><a accesskey="4" href="Once_002dOnly-Headers.html#Once_002dOnly-Headers">Once-Only Headers</a>
|
||||
<li><a accesskey="5" href="Alternatives-to-Wrapper-_0023ifndef.html#Alternatives-to-Wrapper-_0023ifndef">Alternatives to Wrapper #ifndef</a>
|
||||
<li><a accesskey="6" href="Computed-Includes.html#Computed-Includes">Computed Includes</a>
|
||||
<li><a accesskey="7" href="Wrapper-Headers.html#Wrapper-Headers">Wrapper Headers</a>
|
||||
<li><a accesskey="8" href="System-Headers.html#System-Headers">System Headers</a>
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1 @@
|
||||
<meta http-equiv="refresh" content="0; url=Implementation_002ddefined-behavior.html#Identifier%20characters">
|
@@ -0,0 +1,118 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>If - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Conditional-Syntax.html#Conditional-Syntax" title="Conditional Syntax">
|
||||
<link rel="prev" href="Ifdef.html#Ifdef" title="Ifdef">
|
||||
<link rel="next" href="Defined.html#Defined" title="Defined">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="If"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Defined.html#Defined">Defined</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Ifdef.html#Ifdef">Ifdef</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Conditional-Syntax.html#Conditional-Syntax">Conditional Syntax</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h4 class="subsection">4.2.2 If</h4>
|
||||
|
||||
<p>The ‘<samp><span class="samp">#if</span></samp>’ directive allows you to test the value of an arithmetic
|
||||
expression, rather than the mere existence of one macro. Its syntax is
|
||||
|
||||
<pre class="smallexample"> #if <var>expression</var>
|
||||
|
||||
<var>controlled text</var>
|
||||
|
||||
#endif /* <var>expression</var> */
|
||||
</pre>
|
||||
<p><var>expression</var> is a C expression of integer type, subject to stringent
|
||||
restrictions. It may contain
|
||||
|
||||
<ul>
|
||||
<li>Integer constants.
|
||||
|
||||
<li>Character constants, which are interpreted as they would be in normal
|
||||
code.
|
||||
|
||||
<li>Arithmetic operators for addition, subtraction, multiplication,
|
||||
division, bitwise operations, shifts, comparisons, and logical
|
||||
operations (<code>&&</code> and <code>||</code>). The latter two obey the usual
|
||||
short-circuiting rules of standard C.
|
||||
|
||||
<li>Macros. All macros in the expression are expanded before actual
|
||||
computation of the expression's value begins.
|
||||
|
||||
<li>Uses of the <code>defined</code> operator, which lets you check whether macros
|
||||
are defined in the middle of an ‘<samp><span class="samp">#if</span></samp>’.
|
||||
|
||||
<li>Identifiers that are not macros, which are all considered to be the
|
||||
number zero. This allows you to write <code>#if MACRO<!-- /@w --></code> instead of
|
||||
<code>#ifdef MACRO<!-- /@w --></code>, if you know that MACRO, when defined, will
|
||||
always have a nonzero value. Function-like macros used without their
|
||||
function call parentheses are also treated as zero.
|
||||
|
||||
<p>In some contexts this shortcut is undesirable. The <samp><span class="option">-Wundef</span></samp>
|
||||
option causes GCC to warn whenever it encounters an identifier which is
|
||||
not a macro in an ‘<samp><span class="samp">#if</span></samp>’.
|
||||
</ul>
|
||||
|
||||
<p>The preprocessor does not know anything about types in the language.
|
||||
Therefore, <code>sizeof</code> operators are not recognized in ‘<samp><span class="samp">#if</span></samp>’, and
|
||||
neither are <code>enum</code> constants. They will be taken as identifiers
|
||||
which are not macros, and replaced by zero. In the case of
|
||||
<code>sizeof</code>, this is likely to cause the expression to be invalid.
|
||||
|
||||
<p>The preprocessor calculates the value of <var>expression</var>. It carries
|
||||
out all calculations in the widest integer type known to the compiler;
|
||||
on most machines supported by GCC this is 64 bits. This is not the same
|
||||
rule as the compiler uses to calculate the value of a constant
|
||||
expression, and may give different results in some cases. If the value
|
||||
comes out to be nonzero, the ‘<samp><span class="samp">#if</span></samp>’ succeeds and the <var>controlled
|
||||
text</var> is included; otherwise it is skipped.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,130 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Ifdef - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Conditional-Syntax.html#Conditional-Syntax" title="Conditional Syntax">
|
||||
<link rel="next" href="If.html#If" title="If">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Ifdef"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="If.html#If">If</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Conditional-Syntax.html#Conditional-Syntax">Conditional Syntax</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h4 class="subsection">4.2.1 Ifdef</h4>
|
||||
|
||||
<p><a name="index-g_t_0023ifdef-85"></a><a name="index-g_t_0023endif-86"></a>
|
||||
The simplest sort of conditional is
|
||||
|
||||
<pre class="smallexample"> #ifdef <var>MACRO</var>
|
||||
|
||||
<var>controlled text</var>
|
||||
|
||||
#endif /* <var>MACRO</var> */
|
||||
</pre>
|
||||
<p><a name="index-conditional-group-87"></a>This block is called a <dfn>conditional group</dfn>. <var>controlled text</var>
|
||||
will be included in the output of the preprocessor if and only if
|
||||
<var>MACRO</var> is defined. We say that the conditional <dfn>succeeds</dfn> if
|
||||
<var>MACRO</var> is defined, <dfn>fails</dfn> if it is not.
|
||||
|
||||
<p>The <var>controlled text</var> inside of a conditional can include
|
||||
preprocessing directives. They are executed only if the conditional
|
||||
succeeds. You can nest conditional groups inside other conditional
|
||||
groups, but they must be completely nested. In other words,
|
||||
‘<samp><span class="samp">#endif</span></samp>’ always matches the nearest ‘<samp><span class="samp">#ifdef</span></samp>’ (or
|
||||
‘<samp><span class="samp">#ifndef</span></samp>’, or ‘<samp><span class="samp">#if</span></samp>’). Also, you cannot start a conditional
|
||||
group in one file and end it in another.
|
||||
|
||||
<p>Even if a conditional fails, the <var>controlled text</var> inside it is
|
||||
still run through initial transformations and tokenization. Therefore,
|
||||
it must all be lexically valid C. Normally the only way this matters is
|
||||
that all comments and string literals inside a failing conditional group
|
||||
must still be properly ended.
|
||||
|
||||
<p>The comment following the ‘<samp><span class="samp">#endif</span></samp>’ is not required, but it is a
|
||||
good practice if there is a lot of <var>controlled text</var>, because it
|
||||
helps people match the ‘<samp><span class="samp">#endif</span></samp>’ to the corresponding ‘<samp><span class="samp">#ifdef</span></samp>’.
|
||||
Older programs sometimes put <var>MACRO</var> directly after the
|
||||
‘<samp><span class="samp">#endif</span></samp>’ without enclosing it in a comment. This is invalid code
|
||||
according to the C standard. CPP accepts it with a warning. It
|
||||
never affects which ‘<samp><span class="samp">#ifndef</span></samp>’ the ‘<samp><span class="samp">#endif</span></samp>’ matches.
|
||||
|
||||
<p><a name="index-g_t_0023ifndef-88"></a>Sometimes you wish to use some code if a macro is <em>not</em> defined.
|
||||
You can do this by writing ‘<samp><span class="samp">#ifndef</span></samp>’ instead of ‘<samp><span class="samp">#ifdef</span></samp>’.
|
||||
One common use of ‘<samp><span class="samp">#ifndef</span></samp>’ is to include code only the first
|
||||
time a header file is included. See <a href="Once_002dOnly-Headers.html#Once_002dOnly-Headers">Once-Only Headers</a>.
|
||||
|
||||
<p>Macro definitions can vary between compilations for several reasons.
|
||||
Here are some samples.
|
||||
|
||||
<ul>
|
||||
<li>Some macros are predefined on each kind of machine
|
||||
(see <a href="System_002dspecific-Predefined-Macros.html#System_002dspecific-Predefined-Macros">System-specific Predefined Macros</a>). This allows you to provide
|
||||
code specially tuned for a particular machine.
|
||||
|
||||
<li>System header files define more macros, associated with the features
|
||||
they implement. You can test these macros with conditionals to avoid
|
||||
using a system feature on a machine where it is not implemented.
|
||||
|
||||
<li>Macros can be defined or undefined with the <samp><span class="option">-D</span></samp> and <samp><span class="option">-U</span></samp>
|
||||
command line options when you compile the program. You can arrange to
|
||||
compile the same source file into two different programs by choosing a
|
||||
macro name to specify which program you want, writing conditionals to
|
||||
test whether or how this macro is defined, and then controlling the
|
||||
state of the macro with command line options, perhaps set in the
|
||||
Makefile. See <a href="Invocation.html#Invocation">Invocation</a>.
|
||||
|
||||
<li>Your program might have a special header file (often called
|
||||
<samp><span class="file">config.h</span></samp>) that is adjusted when the program is compiled. It can
|
||||
define or not define macros depending on the features of the system and
|
||||
the desired capabilities of the program. The adjustment can be
|
||||
automated by a tool such as <samp><span class="command">autoconf</span></samp>, or done by hand.
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,78 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Implementation Details - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="Traditional-Mode.html#Traditional-Mode" title="Traditional Mode">
|
||||
<link rel="next" href="Invocation.html#Invocation" title="Invocation">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Implementation-Details"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Invocation.html#Invocation">Invocation</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Traditional-Mode.html#Traditional-Mode">Traditional Mode</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="chapter">11 Implementation Details</h2>
|
||||
|
||||
<p>Here we document details of how the preprocessor's implementation
|
||||
affects its user-visible behavior. You should try to avoid undue
|
||||
reliance on behavior described here, as it is possible that it will
|
||||
change subtly in future implementations.
|
||||
|
||||
<p>Also documented here are obsolete features and changes from previous
|
||||
versions of CPP.
|
||||
|
||||
<ul class="menu">
|
||||
<li><a accesskey="1" href="Implementation_002ddefined-behavior.html#Implementation_002ddefined-behavior">Implementation-defined behavior</a>
|
||||
<li><a accesskey="2" href="Implementation-limits.html#Implementation-limits">Implementation limits</a>
|
||||
<li><a accesskey="3" href="Obsolete-Features.html#Obsolete-Features">Obsolete Features</a>
|
||||
<li><a accesskey="4" href="Differences-from-previous-versions.html#Differences-from-previous-versions">Differences from previous versions</a>
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,125 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Implementation limits - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Implementation-Details.html#Implementation-Details" title="Implementation Details">
|
||||
<link rel="prev" href="Implementation_002ddefined-behavior.html#Implementation_002ddefined-behavior" title="Implementation-defined behavior">
|
||||
<link rel="next" href="Obsolete-Features.html#Obsolete-Features" title="Obsolete Features">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Implementation-limits"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Obsolete-Features.html#Obsolete-Features">Obsolete Features</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Implementation_002ddefined-behavior.html#Implementation_002ddefined-behavior">Implementation-defined behavior</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Implementation-Details.html#Implementation-Details">Implementation Details</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">11.2 Implementation limits</h3>
|
||||
|
||||
<p><a name="index-implementation-limits-110"></a>
|
||||
CPP has a small number of internal limits. This section lists the
|
||||
limits which the C standard requires to be no lower than some minimum,
|
||||
and all the others known. It is intended that there should be as few limits
|
||||
as possible. If you encounter an undocumented or inconvenient limit,
|
||||
please report that as a bug. See <a href="../gcc/Bugs.html#Bugs">Reporting Bugs</a>.
|
||||
|
||||
<p>Where we say something is limited <dfn>only by available memory</dfn>, that
|
||||
means that internal data structures impose no intrinsic limit, and space
|
||||
is allocated with <code>malloc</code> or equivalent. The actual limit will
|
||||
therefore depend on many things, such as the size of other things
|
||||
allocated by the compiler at the same time, the amount of memory
|
||||
consumed by other processes on the same computer, etc.
|
||||
|
||||
<ul>
|
||||
<li>Nesting levels of ‘<samp><span class="samp">#include</span></samp>’ files.
|
||||
|
||||
<p>We impose an arbitrary limit of 200 levels, to avoid runaway recursion.
|
||||
The standard requires at least 15 levels.
|
||||
|
||||
<li>Nesting levels of conditional inclusion.
|
||||
|
||||
<p>The C standard mandates this be at least 63. CPP is limited only by
|
||||
available memory.
|
||||
|
||||
<li>Levels of parenthesized expressions within a full expression.
|
||||
|
||||
<p>The C standard requires this to be at least 63. In preprocessor
|
||||
conditional expressions, it is limited only by available memory.
|
||||
|
||||
<li>Significant initial characters in an identifier or macro name.
|
||||
|
||||
<p>The preprocessor treats all characters as significant. The C standard
|
||||
requires only that the first 63 be significant.
|
||||
|
||||
<li>Number of macros simultaneously defined in a single translation unit.
|
||||
|
||||
<p>The standard requires at least 4095 be possible. CPP is limited only
|
||||
by available memory.
|
||||
|
||||
<li>Number of parameters in a macro definition and arguments in a macro call.
|
||||
|
||||
<p>We allow <code>USHRT_MAX</code>, which is no smaller than 65,535. The minimum
|
||||
required by the standard is 127.
|
||||
|
||||
<li>Number of characters on a logical source line.
|
||||
|
||||
<p>The C standard requires a minimum of 4096 be permitted. CPP places
|
||||
no limits on this, but you may get incorrect column numbers reported in
|
||||
diagnostics for lines longer than 65,535 characters.
|
||||
|
||||
<li>Maximum size of a source file.
|
||||
|
||||
<p>The standard does not specify any lower limit on the maximum size of a
|
||||
source file. GNU cpp maps files into memory, so it is limited by the
|
||||
available address space. This is generally at least two gigabytes.
|
||||
Depending on the operating system, the size of physical memory may or
|
||||
may not be a limitation.
|
||||
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,148 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Implementation-defined behavior - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Implementation-Details.html#Implementation-Details" title="Implementation Details">
|
||||
<link rel="next" href="Implementation-limits.html#Implementation-limits" title="Implementation limits">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Implementation-defined-behavior"></a>
|
||||
<a name="Implementation_002ddefined-behavior"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Implementation-limits.html#Implementation-limits">Implementation limits</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Implementation-Details.html#Implementation-Details">Implementation Details</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">11.1 Implementation-defined behavior</h3>
|
||||
|
||||
<p><a name="index-implementation_002ddefined-behavior-109"></a>
|
||||
This is how CPP behaves in all the cases which the C standard
|
||||
describes as <dfn>implementation-defined</dfn>. This term means that the
|
||||
implementation is free to do what it likes, but must document its choice
|
||||
and stick to it.
|
||||
<!-- FIXME: Check the C++ standard for more implementation-defined stuff. -->
|
||||
|
||||
<ul>
|
||||
<li>The mapping of physical source file multi-byte characters to the
|
||||
execution character set.
|
||||
|
||||
<p>The input character set can be specified using the
|
||||
<samp><span class="option">-finput-charset</span></samp> option, while the execution character set may
|
||||
be controlled using the <samp><span class="option">-fexec-charset</span></samp> and
|
||||
<samp><span class="option">-fwide-exec-charset</span></samp> options.
|
||||
|
||||
<li>Identifier characters.
|
||||
<a name="Identifier-characters"></a>The C and C++ standards allow identifiers to be composed of ‘<samp><span class="samp">_</span></samp>’
|
||||
and the alphanumeric characters. C++ and C99 also allow universal
|
||||
character names, and C99 further permits implementation-defined
|
||||
characters. GCC currently only permits universal character names if
|
||||
<samp><span class="option">-fextended-identifiers</span></samp> is used, because the implementation of
|
||||
universal character names in identifiers is experimental.
|
||||
|
||||
<p>GCC allows the ‘<samp><span class="samp">$</span></samp>’ character in identifiers as an extension for
|
||||
most targets. This is true regardless of the <samp><span class="option">std=</span></samp> switch,
|
||||
since this extension cannot conflict with standards-conforming
|
||||
programs. When preprocessing assembler, however, dollars are not
|
||||
identifier characters by default.
|
||||
|
||||
<p>Currently the targets that by default do not permit ‘<samp><span class="samp">$</span></samp>’ are AVR,
|
||||
IP2K, MMIX, MIPS Irix 3, ARM aout, and PowerPC targets for the AIX
|
||||
operating system.
|
||||
|
||||
<p>You can override the default with <samp><span class="option">-fdollars-in-identifiers</span></samp> or
|
||||
<samp><span class="option">fno-dollars-in-identifiers</span></samp>. See <a href="fdollars_002din_002didentifiers.html#fdollars_002din_002didentifiers">fdollars-in-identifiers</a>.
|
||||
|
||||
<li>Non-empty sequences of whitespace characters.
|
||||
|
||||
<p>In textual output, each whitespace sequence is collapsed to a single
|
||||
space. For aesthetic reasons, the first token on each non-directive
|
||||
line of output is preceded with sufficient spaces that it appears in the
|
||||
same column as it did in the original source file.
|
||||
|
||||
<li>The numeric value of character constants in preprocessor expressions.
|
||||
|
||||
<p>The preprocessor and compiler interpret character constants in the
|
||||
same way; i.e. escape sequences such as ‘<samp><span class="samp">\a</span></samp>’ are given the
|
||||
values they would have on the target machine.
|
||||
|
||||
<p>The compiler evaluates a multi-character character constant a character
|
||||
at a time, shifting the previous value left by the number of bits per
|
||||
target character, and then or-ing in the bit-pattern of the new
|
||||
character truncated to the width of a target character. The final
|
||||
bit-pattern is given type <code>int</code>, and is therefore signed,
|
||||
regardless of whether single characters are signed or not (a slight
|
||||
change from versions 3.1 and earlier of GCC). If there are more
|
||||
characters in the constant than would fit in the target <code>int</code> the
|
||||
compiler issues a warning, and the excess leading characters are
|
||||
ignored.
|
||||
|
||||
<p>For example, <code>'ab'</code> for a target with an 8-bit <code>char</code> would be
|
||||
interpreted as ‘<samp><span class="samp">(int) ((unsigned char) 'a' * 256 + (unsigned char) 'b')</span></samp>’<!-- /@w -->, and <code>'\234a'</code> as ‘<samp><span class="samp">(int) ((unsigned char) '\234' * 256 + (unsigned char) 'a')</span></samp>’<!-- /@w -->.
|
||||
|
||||
<li>Source file inclusion.
|
||||
|
||||
<p>For a discussion on how the preprocessor locates header files,
|
||||
<a href="Include-Operation.html#Include-Operation">Include Operation</a>.
|
||||
|
||||
<li>Interpretation of the filename resulting from a macro-expanded
|
||||
‘<samp><span class="samp">#include</span></samp>’ directive.
|
||||
|
||||
<p>See <a href="Computed-Includes.html#Computed-Includes">Computed Includes</a>.
|
||||
|
||||
<li>Treatment of a ‘<samp><span class="samp">#pragma</span></samp>’ directive that after macro-expansion
|
||||
results in a standard pragma.
|
||||
|
||||
<p>No macro expansion occurs on any ‘<samp><span class="samp">#pragma</span></samp>’ directive line, so the
|
||||
question does not arise.
|
||||
|
||||
<p>Note that GCC does not yet implement any of the standard
|
||||
pragmas.
|
||||
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,116 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Include Operation - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Header-Files.html#Header-Files" title="Header Files">
|
||||
<link rel="prev" href="Include-Syntax.html#Include-Syntax" title="Include Syntax">
|
||||
<link rel="next" href="Search-Path.html#Search-Path" title="Search Path">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Include-Operation"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Search-Path.html#Search-Path">Search Path</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Include-Syntax.html#Include-Syntax">Include Syntax</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Header-Files.html#Header-Files">Header Files</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">2.2 Include Operation</h3>
|
||||
|
||||
<p>The ‘<samp><span class="samp">#include</span></samp>’ directive works by directing the C preprocessor to
|
||||
scan the specified file as input before continuing with the rest of the
|
||||
current file. The output from the preprocessor contains the output
|
||||
already generated, followed by the output resulting from the included
|
||||
file, followed by the output that comes from the text after the
|
||||
‘<samp><span class="samp">#include</span></samp>’ directive. For example, if you have a header file
|
||||
<samp><span class="file">header.h</span></samp> as follows,
|
||||
|
||||
<pre class="smallexample"> char *test (void);
|
||||
</pre>
|
||||
<p class="noindent">and a main program called <samp><span class="file">program.c</span></samp> that uses the header file,
|
||||
like this,
|
||||
|
||||
<pre class="smallexample"> int x;
|
||||
#include "header.h"
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
puts (test ());
|
||||
}
|
||||
</pre>
|
||||
<p class="noindent">the compiler will see the same token stream as it would if
|
||||
<samp><span class="file">program.c</span></samp> read
|
||||
|
||||
<pre class="smallexample"> int x;
|
||||
char *test (void);
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
puts (test ());
|
||||
}
|
||||
</pre>
|
||||
<p>Included files are not limited to declarations and macro definitions;
|
||||
those are merely the typical uses. Any fragment of a C program can be
|
||||
included from another file. The include file could even contain the
|
||||
beginning of a statement that is concluded in the containing file, or
|
||||
the end of a statement that was started in the including file. However,
|
||||
an included file must consist of complete tokens. Comments and string
|
||||
literals which have not been closed by the end of an included file are
|
||||
invalid. For error recovery, they are considered to end at the end of
|
||||
the file.
|
||||
|
||||
<p>To avoid confusion, it is best if header files contain only complete
|
||||
syntactic units—function declarations or definitions, type
|
||||
declarations, etc.
|
||||
|
||||
<p>The line following the ‘<samp><span class="samp">#include</span></samp>’ directive is always treated as a
|
||||
separate line by the C preprocessor, even if the included file lacks a
|
||||
final newline.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,92 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Include Syntax - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Header-Files.html#Header-Files" title="Header Files">
|
||||
<link rel="next" href="Include-Operation.html#Include-Operation" title="Include Operation">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Include-Syntax"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Include-Operation.html#Include-Operation">Include Operation</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Header-Files.html#Header-Files">Header Files</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">2.1 Include Syntax</h3>
|
||||
|
||||
<p><a name="index-g_t_0023include-27"></a>Both user and system header files are included using the preprocessing
|
||||
directive ‘<samp><span class="samp">#include</span></samp>’. It has two variants:
|
||||
|
||||
<dl>
|
||||
<dt><code>#include <</code><var>file</var><code>></code><dd>This variant is used for system header files. It searches for a file
|
||||
named <var>file</var> in a standard list of system directories. You can prepend
|
||||
directories to this list with the <samp><span class="option">-I</span></samp> option (see <a href="Invocation.html#Invocation">Invocation</a>).
|
||||
|
||||
<br><dt><code>#include "</code><var>file</var><code>"</code><dd>This variant is used for header files of your own program. It
|
||||
searches for a file named <var>file</var> first in the directory containing
|
||||
the current file, then in the quote directories and then the same
|
||||
directories used for <code><</code><var>file</var><code>></code>. You can prepend directories
|
||||
to the list of quote directories with the <samp><span class="option">-iquote</span></samp> option.
|
||||
</dl>
|
||||
|
||||
<p>The argument of ‘<samp><span class="samp">#include</span></samp>’, whether delimited with quote marks or
|
||||
angle brackets, behaves like a string constant in that comments are not
|
||||
recognized, and macro names are not expanded. Thus, <code>#include <x/*y><!-- /@w --></code> specifies inclusion of a system header file named <samp><span class="file">x/*y</span></samp>.
|
||||
|
||||
<p>However, if backslashes occur within <var>file</var>, they are considered
|
||||
ordinary text characters, not escape characters. None of the character
|
||||
escape sequences appropriate to string constants in C are processed.
|
||||
Thus, <code>#include "x\n\\y"<!-- /@w --></code> specifies a filename containing three
|
||||
backslashes. (Some systems interpret ‘<samp><span class="samp">\</span></samp>’ as a pathname separator.
|
||||
All of these also interpret ‘<samp><span class="samp">/</span></samp>’ the same way. It is most portable
|
||||
to use only ‘<samp><span class="samp">/</span></samp>’.)
|
||||
|
||||
<p>It is an error if there is anything (other than comments) on the line
|
||||
after the file name.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,86 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Index of Directives - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="GNU-Free-Documentation-License.html#GNU-Free-Documentation-License" title="GNU Free Documentation License">
|
||||
<link rel="next" href="Option-Index.html#Option-Index" title="Option Index">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Index-of-Directives"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Option-Index.html#Option-Index">Option Index</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="GNU-Free-Documentation-License.html#GNU-Free-Documentation-License">GNU Free Documentation License</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="unnumbered">Index of Directives</h2>
|
||||
|
||||
<ul class="index-fn" compact>
|
||||
<li><a href="Obsolete-Features.html#index-g_t_0023assert-114"><code>#assert</code></a>: <a href="Obsolete-Features.html#Obsolete-Features">Obsolete Features</a></li>
|
||||
<li><a href="Object_002dlike-Macros.html#index-g_t_0023define-44"><code>#define</code></a>: <a href="Object_002dlike-Macros.html#Object_002dlike-Macros">Object-like Macros</a></li>
|
||||
<li><a href="Elif.html#index-g_t_0023elif-91"><code>#elif</code></a>: <a href="Elif.html#Elif">Elif</a></li>
|
||||
<li><a href="Else.html#index-g_t_0023else-90"><code>#else</code></a>: <a href="Else.html#Else">Else</a></li>
|
||||
<li><a href="Ifdef.html#index-g_t_0023endif-86"><code>#endif</code></a>: <a href="Ifdef.html#Ifdef">Ifdef</a></li>
|
||||
<li><a href="Diagnostics.html#index-g_t_0023error-96"><code>#error</code></a>: <a href="Diagnostics.html#Diagnostics">Diagnostics</a></li>
|
||||
<li><a href="Other-Directives.html#index-g_t_0023ident-104"><code>#ident</code></a>: <a href="Other-Directives.html#Other-Directives">Other Directives</a></li>
|
||||
<li><a href="Conditional-Syntax.html#index-g_t_0023if-84"><code>#if</code></a>: <a href="Conditional-Syntax.html#Conditional-Syntax">Conditional Syntax</a></li>
|
||||
<li><a href="Ifdef.html#index-g_t_0023ifdef-85"><code>#ifdef</code></a>: <a href="Ifdef.html#Ifdef">Ifdef</a></li>
|
||||
<li><a href="Ifdef.html#index-g_t_0023ifndef-88"><code>#ifndef</code></a>: <a href="Ifdef.html#Ifdef">Ifdef</a></li>
|
||||
<li><a href="Alternatives-to-Wrapper-_0023ifndef.html#index-g_t_0023import-33"><code>#import</code></a>: <a href="Alternatives-to-Wrapper-_0023ifndef.html#Alternatives-to-Wrapper-_0023ifndef">Alternatives to Wrapper #ifndef</a></li>
|
||||
<li><a href="Include-Syntax.html#index-g_t_0023include-27"><code>#include</code></a>: <a href="Include-Syntax.html#Include-Syntax">Include Syntax</a></li>
|
||||
<li><a href="Wrapper-Headers.html#index-g_t_0023include_005fnext-38"><code>#include_next</code></a>: <a href="Wrapper-Headers.html#Wrapper-Headers">Wrapper Headers</a></li>
|
||||
<li><a href="Line-Control.html#index-g_t_0023line-99"><code>#line</code></a>: <a href="Line-Control.html#Line-Control">Line Control</a></li>
|
||||
<li><a href="Pragmas.html#index-g_t_0023pragma-GCC-dependency-101"><code>#pragma GCC dependency</code></a>: <a href="Pragmas.html#Pragmas">Pragmas</a></li>
|
||||
<li><a href="Pragmas.html#index-g_t_0023pragma-GCC-poison-102"><code>#pragma GCC poison</code></a>: <a href="Pragmas.html#Pragmas">Pragmas</a></li>
|
||||
<li><a href="Pragmas.html#index-g_t_0023pragma-GCC-system_005fheader-103"><code>#pragma GCC system_header</code></a>: <a href="Pragmas.html#Pragmas">Pragmas</a></li>
|
||||
<li><a href="System-Headers.html#index-g_t_0023pragma-GCC-system_005fheader-40"><code>#pragma GCC system_header</code></a>: <a href="System-Headers.html#System-Headers">System Headers</a></li>
|
||||
<li><a href="Other-Directives.html#index-g_t_0023sccs-105"><code>#sccs</code></a>: <a href="Other-Directives.html#Other-Directives">Other Directives</a></li>
|
||||
<li><a href="Obsolete-Features.html#index-g_t_0023unassert-116"><code>#unassert</code></a>: <a href="Obsolete-Features.html#Obsolete-Features">Obsolete Features</a></li>
|
||||
<li><a href="Undefining-and-Redefining-Macros.html#index-g_t_0023undef-70"><code>#undef</code></a>: <a href="Undefining-and-Redefining-Macros.html#Undefining-and-Redefining-Macros">Undefining and Redefining Macros</a></li>
|
||||
<li><a href="Diagnostics.html#index-g_t_0023warning-97"><code>#warning</code></a>: <a href="Diagnostics.html#Diagnostics">Diagnostics</a></li>
|
||||
</ul></body></html>
|
||||
|
@@ -0,0 +1,199 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Initial processing - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Overview.html#Overview" title="Overview">
|
||||
<link rel="prev" href="Character-sets.html#Character-sets" title="Character sets">
|
||||
<link rel="next" href="Tokenization.html#Tokenization" title="Tokenization">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Initial-processing"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Tokenization.html#Tokenization">Tokenization</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Character-sets.html#Character-sets">Character sets</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Overview.html#Overview">Overview</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">1.2 Initial processing</h3>
|
||||
|
||||
<p>The preprocessor performs a series of textual transformations on its
|
||||
input. These happen before all other processing. Conceptually, they
|
||||
happen in a rigid order, and the entire file is run through each
|
||||
transformation before the next one begins. CPP actually does them
|
||||
all at once, for performance reasons. These transformations correspond
|
||||
roughly to the first three “phases of translation” described in the C
|
||||
standard.
|
||||
|
||||
<ol type=1 start=1>
|
||||
<li><a name="index-line-endings-1"></a>The input file is read into memory and broken into lines.
|
||||
|
||||
<p>Different systems use different conventions to indicate the end of a
|
||||
line. GCC accepts the ASCII control sequences <kbd>LF</kbd>, <kbd>CR LF<!-- /@w --></kbd> and <kbd>CR</kbd> as end-of-line markers. These are the canonical
|
||||
sequences used by Unix, DOS and VMS, and the classic Mac OS (before
|
||||
OSX) respectively. You may therefore safely copy source code written
|
||||
on any of those systems to a different one and use it without
|
||||
conversion. (GCC may lose track of the current line number if a file
|
||||
doesn't consistently use one convention, as sometimes happens when it
|
||||
is edited on computers with different conventions that share a network
|
||||
file system.)
|
||||
|
||||
<p>If the last line of any input file lacks an end-of-line marker, the end
|
||||
of the file is considered to implicitly supply one. The C standard says
|
||||
that this condition provokes undefined behavior, so GCC will emit a
|
||||
warning message.
|
||||
|
||||
<li><a name="index-trigraphs-2"></a><a name="trigraphs"></a>If trigraphs are enabled, they are replaced by their
|
||||
corresponding single characters. By default GCC ignores trigraphs,
|
||||
but if you request a strictly conforming mode with the <samp><span class="option">-std</span></samp>
|
||||
option, or you specify the <samp><span class="option">-trigraphs</span></samp> option, then it
|
||||
converts them.
|
||||
|
||||
<p>These are nine three-character sequences, all starting with ‘<samp><span class="samp">??</span></samp>’,
|
||||
that are defined by ISO C to stand for single characters. They permit
|
||||
obsolete systems that lack some of C's punctuation to use C. For
|
||||
example, ‘<samp><span class="samp">??/</span></samp>’ stands for ‘<samp><span class="samp">\</span></samp>’, so <tt>'??/n'</tt> is a character
|
||||
constant for a newline.
|
||||
|
||||
<p>Trigraphs are not popular and many compilers implement them
|
||||
incorrectly. Portable code should not rely on trigraphs being either
|
||||
converted or ignored. With <samp><span class="option">-Wtrigraphs</span></samp> GCC will warn you
|
||||
when a trigraph may change the meaning of your program if it were
|
||||
converted. See <a href="Wtrigraphs.html#Wtrigraphs">Wtrigraphs</a>.
|
||||
|
||||
<p>In a string constant, you can prevent a sequence of question marks
|
||||
from being confused with a trigraph by inserting a backslash between
|
||||
the question marks, or by separating the string literal at the
|
||||
trigraph and making use of string literal concatenation. <tt>"(??\?)"</tt>
|
||||
is the string ‘<samp><span class="samp">(???)</span></samp>’, not ‘<samp><span class="samp">(?]</span></samp>’. Traditional C compilers
|
||||
do not recognize these idioms.
|
||||
|
||||
<p>The nine trigraphs and their replacements are
|
||||
|
||||
<pre class="smallexample"> Trigraph: ??( ??) ??< ??> ??= ??/ ??' ??! ??-
|
||||
Replacement: [ ] { } # \ ^ | ~
|
||||
</pre>
|
||||
<li><a name="index-continued-lines-3"></a><a name="index-backslash_002dnewline-4"></a>Continued lines are merged into one long line.
|
||||
|
||||
<p>A continued line is a line which ends with a backslash, ‘<samp><span class="samp">\</span></samp>’. The
|
||||
backslash is removed and the following line is joined with the current
|
||||
one. No space is inserted, so you may split a line anywhere, even in
|
||||
the middle of a word. (It is generally more readable to split lines
|
||||
only at white space.)
|
||||
|
||||
<p>The trailing backslash on a continued line is commonly referred to as a
|
||||
<dfn>backslash-newline</dfn>.
|
||||
|
||||
<p>If there is white space between a backslash and the end of a line, that
|
||||
is still a continued line. However, as this is usually the result of an
|
||||
editing mistake, and many compilers will not accept it as a continued
|
||||
line, GCC will warn you about it.
|
||||
|
||||
<li><a name="index-comments-5"></a><a name="index-line-comments-6"></a><a name="index-block-comments-7"></a>All comments are replaced with single spaces.
|
||||
|
||||
<p>There are two kinds of comments. <dfn>Block comments</dfn> begin with
|
||||
‘<samp><span class="samp">/*</span></samp>’ and continue until the next ‘<samp><span class="samp">*/</span></samp>’. Block comments do not
|
||||
nest:
|
||||
|
||||
<pre class="smallexample"> /* <span class="roman">this is</span> /* <span class="roman">one comment</span> */ <span class="roman">text outside comment</span>
|
||||
</pre>
|
||||
<p><dfn>Line comments</dfn> begin with ‘<samp><span class="samp">//</span></samp>’ and continue to the end of the
|
||||
current line. Line comments do not nest either, but it does not matter,
|
||||
because they would end in the same place anyway.
|
||||
|
||||
<pre class="smallexample"> // <span class="roman">this is</span> // <span class="roman">one comment</span>
|
||||
<span class="roman">text outside comment</span>
|
||||
</pre>
|
||||
</ol>
|
||||
|
||||
<p>It is safe to put line comments inside block comments, or vice versa.
|
||||
|
||||
<pre class="smallexample"> /* <span class="roman">block comment</span>
|
||||
// <span class="roman">contains line comment</span>
|
||||
<span class="roman">yet more comment</span>
|
||||
*/ <span class="roman">outside comment</span>
|
||||
|
||||
// <span class="roman">line comment</span> /* <span class="roman">contains block comment</span> */
|
||||
</pre>
|
||||
<p>But beware of commenting out one end of a block comment with a line
|
||||
comment.
|
||||
|
||||
<pre class="smallexample"> // <span class="roman">l.c.</span> /* <span class="roman">block comment begins</span>
|
||||
<span class="roman">oops! this isn't a comment anymore</span> */
|
||||
</pre>
|
||||
<p>Comments are not recognized within string literals.
|
||||
<tt>"/* blah */"<!-- /@w --></tt> is the string constant ‘<samp><span class="samp">/* blah */<!-- /@w --></span></samp>’, not
|
||||
an empty string.
|
||||
|
||||
<p>Line comments are not in the 1989 edition of the C standard, but they
|
||||
are recognized by GCC as an extension. In C++ and in the 1999 edition
|
||||
of the C standard, they are an official part of the language.
|
||||
|
||||
<p>Since these transformations happen before all other processing, you can
|
||||
split a line mechanically with backslash-newline anywhere. You can
|
||||
comment out the end of a line. You can continue a line comment onto the
|
||||
next line with backslash-newline. You can even split ‘<samp><span class="samp">/*</span></samp>’,
|
||||
‘<samp><span class="samp">*/</span></samp>’, and ‘<samp><span class="samp">//</span></samp>’ onto multiple lines with backslash-newline.
|
||||
For example:
|
||||
|
||||
<pre class="smallexample"> /\
|
||||
*
|
||||
*/ # /*
|
||||
*/ defi\
|
||||
ne FO\
|
||||
O 10\
|
||||
20
|
||||
</pre>
|
||||
<p class="noindent">is equivalent to <code>#define FOO 1020<!-- /@w --></code>. All these tricks are
|
||||
extremely confusing and should not be used in code intended to be
|
||||
readable.
|
||||
|
||||
<p>There is no way to prevent a backslash at the end of a line from being
|
||||
interpreted as a backslash-newline. This cannot affect any correct
|
||||
program, however.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,635 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Invocation - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="Implementation-Details.html#Implementation-Details" title="Implementation Details">
|
||||
<link rel="next" href="Environment-Variables.html#Environment-Variables" title="Environment Variables">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Invocation"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Environment-Variables.html#Environment-Variables">Environment Variables</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Implementation-Details.html#Implementation-Details">Implementation Details</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="chapter">12 Invocation</h2>
|
||||
|
||||
<p><a name="index-invocation-118"></a><a name="index-command-line-119"></a>
|
||||
Most often when you use the C preprocessor you will not have to invoke it
|
||||
explicitly: the C compiler will do so automatically. However, the
|
||||
preprocessor is sometimes useful on its own. All the options listed
|
||||
here are also acceptable to the C compiler and have the same meaning,
|
||||
except that the C compiler has different rules for specifying the output
|
||||
file.
|
||||
|
||||
<p><em>Note:</em> Whether you use the preprocessor by way of <samp><span class="command">gcc</span></samp>
|
||||
or <samp><span class="command">cpp</span></samp>, the <dfn>compiler driver</dfn> is run first. This
|
||||
program's purpose is to translate your command into invocations of the
|
||||
programs that do the actual work. Their command line interfaces are
|
||||
similar but not identical to the documented interface, and may change
|
||||
without notice.
|
||||
|
||||
<!-- man begin OPTIONS -->
|
||||
<p>The C preprocessor expects two file names as arguments, <var>infile</var> and
|
||||
<var>outfile</var>. The preprocessor reads <var>infile</var> together with any
|
||||
other files it specifies with ‘<samp><span class="samp">#include</span></samp>’. All the output generated
|
||||
by the combined input files is written in <var>outfile</var>.
|
||||
|
||||
<p>Either <var>infile</var> or <var>outfile</var> may be <samp><span class="option">-</span></samp>, which as
|
||||
<var>infile</var> means to read from standard input and as <var>outfile</var>
|
||||
means to write to standard output. Also, if either file is omitted, it
|
||||
means the same as if <samp><span class="option">-</span></samp> had been specified for that file.
|
||||
|
||||
<p>Unless otherwise noted, or the option ends in ‘<samp><span class="samp">=</span></samp>’, all options
|
||||
which take an argument may have that argument appear either immediately
|
||||
after the option, or with a space between option and argument:
|
||||
<samp><span class="option">-Ifoo</span></samp> and <samp><span class="option">-I foo</span></samp> have the same effect.
|
||||
|
||||
<p><a name="index-grouping-options-120"></a><a name="index-options_002c-grouping-121"></a>Many options have multi-letter names; therefore multiple single-letter
|
||||
options may <em>not</em> be grouped: <samp><span class="option">-dM</span></samp> is very different from
|
||||
‘<samp><span class="samp">-d -M</span></samp>’<!-- /@w -->.
|
||||
|
||||
<p><a name="index-options-122"></a>
|
||||
|
||||
<!-- Copyright (c) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, -->
|
||||
<!-- 2010, Free Software Foundation, Inc. -->
|
||||
<!-- This is part of the CPP and GCC manuals. -->
|
||||
<!-- For copying conditions, see the file gcc.texi. -->
|
||||
<!-- -->
|
||||
<!-- Options affecting the preprocessor -->
|
||||
<!-- -->
|
||||
<!-- If this file is included with the flag ``cppmanual'' set, it is -->
|
||||
<!-- formatted for inclusion in the CPP manual; otherwise the main GCC manual. -->
|
||||
<dl>
|
||||
<dt><code>-D </code><var>name</var><dd><a name="index-D-123"></a>Predefine <var>name</var> as a macro, with definition <code>1</code>.
|
||||
|
||||
<br><dt><code>-D </code><var>name</var><code>=</code><var>definition</var><dd>The contents of <var>definition</var> are tokenized and processed as if
|
||||
they appeared during translation phase three in a ‘<samp><span class="samp">#define</span></samp>’
|
||||
directive. In particular, the definition will be truncated by
|
||||
embedded newline characters.
|
||||
|
||||
<p>If you are invoking the preprocessor from a shell or shell-like
|
||||
program you may need to use the shell's quoting syntax to protect
|
||||
characters such as spaces that have a meaning in the shell syntax.
|
||||
|
||||
<p>If you wish to define a function-like macro on the command line, write
|
||||
its argument list with surrounding parentheses before the equals sign
|
||||
(if any). Parentheses are meaningful to most shells, so you will need
|
||||
to quote the option. With <samp><span class="command">sh</span></samp> and <samp><span class="command">csh</span></samp>,
|
||||
<samp><span class="option">-D'</span><var>name</var><span class="option">(</span><var>args<small class="dots">...</small></var><span class="option">)=</span><var>definition</var><span class="option">'</span></samp> works.
|
||||
|
||||
<p><samp><span class="option">-D</span></samp> and <samp><span class="option">-U</span></samp> options are processed in the order they
|
||||
are given on the command line. All <samp><span class="option">-imacros </span><var>file</var></samp> and
|
||||
<samp><span class="option">-include </span><var>file</var></samp> options are processed after all
|
||||
<samp><span class="option">-D</span></samp> and <samp><span class="option">-U</span></samp> options.
|
||||
|
||||
<br><dt><code>-U </code><var>name</var><dd><a name="index-U-124"></a>Cancel any previous definition of <var>name</var>, either built in or
|
||||
provided with a <samp><span class="option">-D</span></samp> option.
|
||||
|
||||
<br><dt><code>-undef</code><dd><a name="index-undef-125"></a>Do not predefine any system-specific or GCC-specific macros. The
|
||||
standard predefined macros remain defined.
|
||||
See <a href="Standard-Predefined-Macros.html#Standard-Predefined-Macros">Standard Predefined Macros</a>.
|
||||
|
||||
<br><dt><code>-I </code><var>dir</var><dd><a name="index-I-126"></a>Add the directory <var>dir</var> to the list of directories to be searched
|
||||
for header files.
|
||||
See <a href="Search-Path.html#Search-Path">Search Path</a>.
|
||||
Directories named by <samp><span class="option">-I</span></samp> are searched before the standard
|
||||
system include directories. If the directory <var>dir</var> is a standard
|
||||
system include directory, the option is ignored to ensure that the
|
||||
default search order for system directories and the special treatment
|
||||
of system headers are not defeated
|
||||
(see <a href="System-Headers.html#System-Headers">System Headers</a>)
|
||||
.
|
||||
If <var>dir</var> begins with <code>=</code>, then the <code>=</code> will be replaced
|
||||
by the sysroot prefix; see <samp><span class="option">--sysroot</span></samp> and <samp><span class="option">-isysroot</span></samp>.
|
||||
|
||||
<br><dt><code>-o </code><var>file</var><dd><a name="index-o-127"></a>Write output to <var>file</var>. This is the same as specifying <var>file</var>
|
||||
as the second non-option argument to <samp><span class="command">cpp</span></samp>. <samp><span class="command">gcc</span></samp> has a
|
||||
different interpretation of a second non-option argument, so you must
|
||||
use <samp><span class="option">-o</span></samp> to specify the output file.
|
||||
|
||||
<br><dt><code>-Wall</code><dd><a name="index-Wall-128"></a>Turns on all optional warnings which are desirable for normal code.
|
||||
At present this is <samp><span class="option">-Wcomment</span></samp>, <samp><span class="option">-Wtrigraphs</span></samp>,
|
||||
<samp><span class="option">-Wmultichar</span></samp> and a warning about integer promotion causing a
|
||||
change of sign in <code>#if</code> expressions. Note that many of the
|
||||
preprocessor's warnings are on by default and have no options to
|
||||
control them.
|
||||
|
||||
<br><dt><code>-Wcomment</code><dt><code>-Wcomments</code><dd><a name="index-Wcomment-129"></a><a name="index-Wcomments-130"></a>Warn whenever a comment-start sequence ‘<samp><span class="samp">/*</span></samp>’ appears in a ‘<samp><span class="samp">/*</span></samp>’
|
||||
comment, or whenever a backslash-newline appears in a ‘<samp><span class="samp">//</span></samp>’ comment.
|
||||
(Both forms have the same effect.)
|
||||
|
||||
<br><dt><code>-Wtrigraphs</code><dd><a name="index-Wtrigraphs-131"></a><a name="Wtrigraphs"></a>Most trigraphs in comments cannot affect the meaning of the program.
|
||||
However, a trigraph that would form an escaped newline (‘<samp><span class="samp">??/</span></samp>’ at
|
||||
the end of a line) can, by changing where the comment begins or ends.
|
||||
Therefore, only trigraphs that would form escaped newlines produce
|
||||
warnings inside a comment.
|
||||
|
||||
<p>This option is implied by <samp><span class="option">-Wall</span></samp>. If <samp><span class="option">-Wall</span></samp> is not
|
||||
given, this option is still enabled unless trigraphs are enabled. To
|
||||
get trigraph conversion without warnings, but get the other
|
||||
<samp><span class="option">-Wall</span></samp> warnings, use ‘<samp><span class="samp">-trigraphs -Wall -Wno-trigraphs</span></samp>’.
|
||||
|
||||
<br><dt><code>-Wtraditional</code><dd><a name="index-Wtraditional-132"></a>Warn about certain constructs that behave differently in traditional and
|
||||
ISO C. Also warn about ISO C constructs that have no traditional C
|
||||
equivalent, and problematic constructs which should be avoided.
|
||||
See <a href="Traditional-Mode.html#Traditional-Mode">Traditional Mode</a>.
|
||||
|
||||
<br><dt><code>-Wundef</code><dd><a name="index-Wundef-133"></a>Warn whenever an identifier which is not a macro is encountered in an
|
||||
‘<samp><span class="samp">#if</span></samp>’ directive, outside of ‘<samp><span class="samp">defined</span></samp>’. Such identifiers are
|
||||
replaced with zero.
|
||||
|
||||
<br><dt><code>-Wunused-macros</code><dd><a name="index-Wunused_002dmacros-134"></a>Warn about macros defined in the main file that are unused. A macro
|
||||
is <dfn>used</dfn> if it is expanded or tested for existence at least once.
|
||||
The preprocessor will also warn if the macro has not been used at the
|
||||
time it is redefined or undefined.
|
||||
|
||||
<p>Built-in macros, macros defined on the command line, and macros
|
||||
defined in include files are not warned about.
|
||||
|
||||
<p><em>Note:</em> If a macro is actually used, but only used in skipped
|
||||
conditional blocks, then CPP will report it as unused. To avoid the
|
||||
warning in such a case, you might improve the scope of the macro's
|
||||
definition by, for example, moving it into the first skipped block.
|
||||
Alternatively, you could provide a dummy use with something like:
|
||||
|
||||
<pre class="smallexample"> #if defined the_macro_causing_the_warning
|
||||
#endif
|
||||
</pre>
|
||||
<br><dt><code>-Wendif-labels</code><dd><a name="index-Wendif_002dlabels-135"></a>Warn whenever an ‘<samp><span class="samp">#else</span></samp>’ or an ‘<samp><span class="samp">#endif</span></samp>’ are followed by text.
|
||||
This usually happens in code of the form
|
||||
|
||||
<pre class="smallexample"> #if FOO
|
||||
...
|
||||
#else FOO
|
||||
...
|
||||
#endif FOO
|
||||
</pre>
|
||||
<p class="noindent">The second and third <code>FOO</code> should be in comments, but often are not
|
||||
in older programs. This warning is on by default.
|
||||
|
||||
<br><dt><code>-Werror</code><dd><a name="index-Werror-136"></a>Make all warnings into hard errors. Source code which triggers warnings
|
||||
will be rejected.
|
||||
|
||||
<br><dt><code>-Wsystem-headers</code><dd><a name="index-Wsystem_002dheaders-137"></a>Issue warnings for code in system headers. These are normally unhelpful
|
||||
in finding bugs in your own code, therefore suppressed. If you are
|
||||
responsible for the system library, you may want to see them.
|
||||
|
||||
<br><dt><code>-w</code><dd><a name="index-w-138"></a>Suppress all warnings, including those which GNU CPP issues by default.
|
||||
|
||||
<br><dt><code>-pedantic</code><dd><a name="index-pedantic-139"></a>Issue all the mandatory diagnostics listed in the C standard. Some of
|
||||
them are left out by default, since they trigger frequently on harmless
|
||||
code.
|
||||
|
||||
<br><dt><code>-pedantic-errors</code><dd><a name="index-pedantic_002derrors-140"></a>Issue all the mandatory diagnostics, and make all mandatory diagnostics
|
||||
into errors. This includes mandatory diagnostics that GCC issues
|
||||
without ‘<samp><span class="samp">-pedantic</span></samp>’ but treats as warnings.
|
||||
|
||||
<br><dt><code>-M</code><dd><a name="index-M-141"></a><a name="index-make-142"></a><a name="index-dependencies_002c-make-143"></a>Instead of outputting the result of preprocessing, output a rule
|
||||
suitable for <samp><span class="command">make</span></samp> describing the dependencies of the main
|
||||
source file. The preprocessor outputs one <samp><span class="command">make</span></samp> rule containing
|
||||
the object file name for that source file, a colon, and the names of all
|
||||
the included files, including those coming from <samp><span class="option">-include</span></samp> or
|
||||
<samp><span class="option">-imacros</span></samp> command line options.
|
||||
|
||||
<p>Unless specified explicitly (with <samp><span class="option">-MT</span></samp> or <samp><span class="option">-MQ</span></samp>), the
|
||||
object file name consists of the name of the source file with any
|
||||
suffix replaced with object file suffix and with any leading directory
|
||||
parts removed. If there are many included files then the rule is
|
||||
split into several lines using ‘<samp><span class="samp">\</span></samp>’-newline. The rule has no
|
||||
commands.
|
||||
|
||||
<p>This option does not suppress the preprocessor's debug output, such as
|
||||
<samp><span class="option">-dM</span></samp>. To avoid mixing such debug output with the dependency
|
||||
rules you should explicitly specify the dependency output file with
|
||||
<samp><span class="option">-MF</span></samp>, or use an environment variable like
|
||||
<samp><span class="env">DEPENDENCIES_OUTPUT</span></samp> (see <a href="Environment-Variables.html#Environment-Variables">Environment Variables</a>). Debug output
|
||||
will still be sent to the regular output stream as normal.
|
||||
|
||||
<p>Passing <samp><span class="option">-M</span></samp> to the driver implies <samp><span class="option">-E</span></samp>, and suppresses
|
||||
warnings with an implicit <samp><span class="option">-w</span></samp>.
|
||||
|
||||
<br><dt><code>-MM</code><dd><a name="index-MM-144"></a>Like <samp><span class="option">-M</span></samp> but do not mention header files that are found in
|
||||
system header directories, nor header files that are included,
|
||||
directly or indirectly, from such a header.
|
||||
|
||||
<p>This implies that the choice of angle brackets or double quotes in an
|
||||
‘<samp><span class="samp">#include</span></samp>’ directive does not in itself determine whether that
|
||||
header will appear in <samp><span class="option">-MM</span></samp> dependency output. This is a
|
||||
slight change in semantics from GCC versions 3.0 and earlier.
|
||||
|
||||
<p><a name="dashMF"></a><br><dt><code>-MF </code><var>file</var><dd><a name="index-MF-145"></a>When used with <samp><span class="option">-M</span></samp> or <samp><span class="option">-MM</span></samp>, specifies a
|
||||
file to write the dependencies to. If no <samp><span class="option">-MF</span></samp> switch is given
|
||||
the preprocessor sends the rules to the same place it would have sent
|
||||
preprocessed output.
|
||||
|
||||
<p>When used with the driver options <samp><span class="option">-MD</span></samp> or <samp><span class="option">-MMD</span></samp>,
|
||||
<samp><span class="option">-MF</span></samp> overrides the default dependency output file.
|
||||
|
||||
<br><dt><code>-MG</code><dd><a name="index-MG-146"></a>In conjunction with an option such as <samp><span class="option">-M</span></samp> requesting
|
||||
dependency generation, <samp><span class="option">-MG</span></samp> assumes missing header files are
|
||||
generated files and adds them to the dependency list without raising
|
||||
an error. The dependency filename is taken directly from the
|
||||
<code>#include</code> directive without prepending any path. <samp><span class="option">-MG</span></samp>
|
||||
also suppresses preprocessed output, as a missing header file renders
|
||||
this useless.
|
||||
|
||||
<p>This feature is used in automatic updating of makefiles.
|
||||
|
||||
<br><dt><code>-MP</code><dd><a name="index-MP-147"></a>This option instructs CPP to add a phony target for each dependency
|
||||
other than the main file, causing each to depend on nothing. These
|
||||
dummy rules work around errors <samp><span class="command">make</span></samp> gives if you remove header
|
||||
files without updating the <samp><span class="file">Makefile</span></samp> to match.
|
||||
|
||||
<p>This is typical output:
|
||||
|
||||
<pre class="smallexample"> test.o: test.c test.h
|
||||
|
||||
test.h:
|
||||
</pre>
|
||||
<br><dt><code>-MT </code><var>target</var><dd><a name="index-MT-148"></a>
|
||||
Change the target of the rule emitted by dependency generation. By
|
||||
default CPP takes the name of the main input file, deletes any
|
||||
directory components and any file suffix such as ‘<samp><span class="samp">.c</span></samp>’, and
|
||||
appends the platform's usual object suffix. The result is the target.
|
||||
|
||||
<p>An <samp><span class="option">-MT</span></samp> option will set the target to be exactly the string you
|
||||
specify. If you want multiple targets, you can specify them as a single
|
||||
argument to <samp><span class="option">-MT</span></samp>, or use multiple <samp><span class="option">-MT</span></samp> options.
|
||||
|
||||
<p>For example, <samp><span class="option">-MT '$(objpfx)foo.o'<!-- /@w --></span></samp> might give
|
||||
|
||||
<pre class="smallexample"> $(objpfx)foo.o: foo.c
|
||||
</pre>
|
||||
<br><dt><code>-MQ </code><var>target</var><dd><a name="index-MQ-149"></a>
|
||||
Same as <samp><span class="option">-MT</span></samp>, but it quotes any characters which are special to
|
||||
Make. <samp><span class="option">-MQ '$(objpfx)foo.o'<!-- /@w --></span></samp> gives
|
||||
|
||||
<pre class="smallexample"> $$(objpfx)foo.o: foo.c
|
||||
</pre>
|
||||
<p>The default target is automatically quoted, as if it were given with
|
||||
<samp><span class="option">-MQ</span></samp>.
|
||||
|
||||
<br><dt><code>-MD</code><dd><a name="index-MD-150"></a><samp><span class="option">-MD</span></samp> is equivalent to <samp><span class="option">-M -MF </span><var>file</var></samp>, except that
|
||||
<samp><span class="option">-E</span></samp> is not implied. The driver determines <var>file</var> based on
|
||||
whether an <samp><span class="option">-o</span></samp> option is given. If it is, the driver uses its
|
||||
argument but with a suffix of <samp><span class="file">.d</span></samp>, otherwise it takes the name
|
||||
of the input file, removes any directory components and suffix, and
|
||||
applies a <samp><span class="file">.d</span></samp> suffix.
|
||||
|
||||
<p>If <samp><span class="option">-MD</span></samp> is used in conjunction with <samp><span class="option">-E</span></samp>, any
|
||||
<samp><span class="option">-o</span></samp> switch is understood to specify the dependency output file
|
||||
(see <a href="dashMF.html#dashMF">-MF</a>), but if used without <samp><span class="option">-E</span></samp>, each <samp><span class="option">-o</span></samp>
|
||||
is understood to specify a target object file.
|
||||
|
||||
<p>Since <samp><span class="option">-E</span></samp> is not implied, <samp><span class="option">-MD</span></samp> can be used to generate
|
||||
a dependency output file as a side-effect of the compilation process.
|
||||
|
||||
<br><dt><code>-MMD</code><dd><a name="index-MMD-151"></a>Like <samp><span class="option">-MD</span></samp> except mention only user header files, not system
|
||||
header files.
|
||||
|
||||
<br><dt><code>-x c</code><dt><code>-x c++</code><dt><code>-x objective-c</code><dt><code>-x assembler-with-cpp</code><dd><a name="index-x-152"></a>Specify the source language: C, C++, Objective-C, or assembly. This has
|
||||
nothing to do with standards conformance or extensions; it merely
|
||||
selects which base syntax to expect. If you give none of these options,
|
||||
cpp will deduce the language from the extension of the source file:
|
||||
‘<samp><span class="samp">.c</span></samp>’, ‘<samp><span class="samp">.cc</span></samp>’, ‘<samp><span class="samp">.m</span></samp>’, or ‘<samp><span class="samp">.S</span></samp>’. Some other common
|
||||
extensions for C++ and assembly are also recognized. If cpp does not
|
||||
recognize the extension, it will treat the file as C; this is the most
|
||||
generic mode.
|
||||
|
||||
<p><em>Note:</em> Previous versions of cpp accepted a <samp><span class="option">-lang</span></samp> option
|
||||
which selected both the language and the standards conformance level.
|
||||
This option has been removed, because it conflicts with the <samp><span class="option">-l</span></samp>
|
||||
option.
|
||||
|
||||
<br><dt><code>-std=</code><var>standard</var><dt><code>-ansi</code><dd><a name="index-ansi-153"></a><a name="index-std_003d-154"></a>Specify the standard to which the code should conform. Currently CPP
|
||||
knows about C and C++ standards; others may be added in the future.
|
||||
|
||||
<p><var>standard</var>
|
||||
may be one of:
|
||||
<dl>
|
||||
<dt><code>c90</code><dt><code>c89</code><dt><code>iso9899:1990</code><dd>The ISO C standard from 1990. ‘<samp><span class="samp">c90</span></samp>’ is the customary shorthand for
|
||||
this version of the standard.
|
||||
|
||||
<p>The <samp><span class="option">-ansi</span></samp> option is equivalent to <samp><span class="option">-std=c90</span></samp>.
|
||||
|
||||
<br><dt><code>iso9899:199409</code><dd>The 1990 C standard, as amended in 1994.
|
||||
|
||||
<br><dt><code>iso9899:1999</code><dt><code>c99</code><dt><code>iso9899:199x</code><dt><code>c9x</code><dd>The revised ISO C standard, published in December 1999. Before
|
||||
publication, this was known as C9X.
|
||||
|
||||
<br><dt><code>gnu90</code><dt><code>gnu89</code><dd>The 1990 C standard plus GNU extensions. This is the default.
|
||||
|
||||
<br><dt><code>gnu99</code><dt><code>gnu9x</code><dd>The 1999 C standard plus GNU extensions.
|
||||
|
||||
<br><dt><code>c++98</code><dd>The 1998 ISO C++ standard plus amendments.
|
||||
|
||||
<br><dt><code>gnu++98</code><dd>The same as <samp><span class="option">-std=c++98</span></samp> plus GNU extensions. This is the
|
||||
default for C++ code.
|
||||
</dl>
|
||||
|
||||
<br><dt><code>-I-</code><dd><a name="index-I_002d-155"></a>Split the include path. Any directories specified with <samp><span class="option">-I</span></samp>
|
||||
options before <samp><span class="option">-I-</span></samp> are searched only for headers requested with
|
||||
<code>#include "</code><var>file</var><code>"<!-- /@w --></code>; they are not searched for
|
||||
<code>#include <</code><var>file</var><code>><!-- /@w --></code>. If additional directories are
|
||||
specified with <samp><span class="option">-I</span></samp> options after the <samp><span class="option">-I-</span></samp>, those
|
||||
directories are searched for all ‘<samp><span class="samp">#include</span></samp>’ directives.
|
||||
|
||||
<p>In addition, <samp><span class="option">-I-</span></samp> inhibits the use of the directory of the current
|
||||
file directory as the first search directory for <code>#include "</code><var>file</var><code>"<!-- /@w --></code>.
|
||||
See <a href="Search-Path.html#Search-Path">Search Path</a>.
|
||||
This option has been deprecated.
|
||||
|
||||
<br><dt><code>-nostdinc</code><dd><a name="index-nostdinc-156"></a>Do not search the standard system directories for header files.
|
||||
Only the directories you have specified with <samp><span class="option">-I</span></samp> options
|
||||
(and the directory of the current file, if appropriate) are searched.
|
||||
|
||||
<br><dt><code>-nostdinc++</code><dd><a name="index-nostdinc_002b_002b-157"></a>Do not search for header files in the C++-specific standard directories,
|
||||
but do still search the other standard directories. (This option is
|
||||
used when building the C++ library.)
|
||||
|
||||
<br><dt><code>-include </code><var>file</var><dd><a name="index-include-158"></a>Process <var>file</var> as if <code>#include "file"</code> appeared as the first
|
||||
line of the primary source file. However, the first directory searched
|
||||
for <var>file</var> is the preprocessor's working directory <em>instead of</em>
|
||||
the directory containing the main source file. If not found there, it
|
||||
is searched for in the remainder of the <code>#include "..."</code> search
|
||||
chain as normal.
|
||||
|
||||
<p>If multiple <samp><span class="option">-include</span></samp> options are given, the files are included
|
||||
in the order they appear on the command line.
|
||||
|
||||
<br><dt><code>-imacros </code><var>file</var><dd><a name="index-imacros-159"></a>Exactly like <samp><span class="option">-include</span></samp>, except that any output produced by
|
||||
scanning <var>file</var> is thrown away. Macros it defines remain defined.
|
||||
This allows you to acquire all the macros from a header without also
|
||||
processing its declarations.
|
||||
|
||||
<p>All files specified by <samp><span class="option">-imacros</span></samp> are processed before all files
|
||||
specified by <samp><span class="option">-include</span></samp>.
|
||||
|
||||
<br><dt><code>-idirafter </code><var>dir</var><dd><a name="index-idirafter-160"></a>Search <var>dir</var> for header files, but do it <em>after</em> all
|
||||
directories specified with <samp><span class="option">-I</span></samp> and the standard system directories
|
||||
have been exhausted. <var>dir</var> is treated as a system include directory.
|
||||
If <var>dir</var> begins with <code>=</code>, then the <code>=</code> will be replaced
|
||||
by the sysroot prefix; see <samp><span class="option">--sysroot</span></samp> and <samp><span class="option">-isysroot</span></samp>.
|
||||
|
||||
<br><dt><code>-iprefix </code><var>prefix</var><dd><a name="index-iprefix-161"></a>Specify <var>prefix</var> as the prefix for subsequent <samp><span class="option">-iwithprefix</span></samp>
|
||||
options. If the prefix represents a directory, you should include the
|
||||
final ‘<samp><span class="samp">/</span></samp>’.
|
||||
|
||||
<br><dt><code>-iwithprefix </code><var>dir</var><dt><code>-iwithprefixbefore </code><var>dir</var><dd><a name="index-iwithprefix-162"></a><a name="index-iwithprefixbefore-163"></a>Append <var>dir</var> to the prefix specified previously with
|
||||
<samp><span class="option">-iprefix</span></samp>, and add the resulting directory to the include search
|
||||
path. <samp><span class="option">-iwithprefixbefore</span></samp> puts it in the same place <samp><span class="option">-I</span></samp>
|
||||
would; <samp><span class="option">-iwithprefix</span></samp> puts it where <samp><span class="option">-idirafter</span></samp> would.
|
||||
|
||||
<br><dt><code>-isysroot </code><var>dir</var><dd><a name="index-isysroot-164"></a>This option is like the <samp><span class="option">--sysroot</span></samp> option, but applies only to
|
||||
header files. See the <samp><span class="option">--sysroot</span></samp> option for more information.
|
||||
|
||||
<br><dt><code>-imultilib </code><var>dir</var><dd><a name="index-imultilib-165"></a>Use <var>dir</var> as a subdirectory of the directory containing
|
||||
target-specific C++ headers.
|
||||
|
||||
<br><dt><code>-isystem </code><var>dir</var><dd><a name="index-isystem-166"></a>Search <var>dir</var> for header files, after all directories specified by
|
||||
<samp><span class="option">-I</span></samp> but before the standard system directories. Mark it
|
||||
as a system directory, so that it gets the same special treatment as
|
||||
is applied to the standard system directories.
|
||||
See <a href="System-Headers.html#System-Headers">System Headers</a>.
|
||||
If <var>dir</var> begins with <code>=</code>, then the <code>=</code> will be replaced
|
||||
by the sysroot prefix; see <samp><span class="option">--sysroot</span></samp> and <samp><span class="option">-isysroot</span></samp>.
|
||||
|
||||
<br><dt><code>-iquote </code><var>dir</var><dd><a name="index-iquote-167"></a>Search <var>dir</var> only for header files requested with
|
||||
<code>#include "</code><var>file</var><code>"<!-- /@w --></code>; they are not searched for
|
||||
<code>#include <</code><var>file</var><code>><!-- /@w --></code>, before all directories specified by
|
||||
<samp><span class="option">-I</span></samp> and before the standard system directories.
|
||||
See <a href="Search-Path.html#Search-Path">Search Path</a>.
|
||||
If <var>dir</var> begins with <code>=</code>, then the <code>=</code> will be replaced
|
||||
by the sysroot prefix; see <samp><span class="option">--sysroot</span></samp> and <samp><span class="option">-isysroot</span></samp>.
|
||||
|
||||
<br><dt><code>-fdirectives-only</code><dd><a name="index-fdirectives_002donly-168"></a>When preprocessing, handle directives, but do not expand macros.
|
||||
|
||||
<p>The option's behavior depends on the <samp><span class="option">-E</span></samp> and <samp><span class="option">-fpreprocessed</span></samp>
|
||||
options.
|
||||
|
||||
<p>With <samp><span class="option">-E</span></samp>, preprocessing is limited to the handling of directives
|
||||
such as <code>#define</code>, <code>#ifdef</code>, and <code>#error</code>. Other
|
||||
preprocessor operations, such as macro expansion and trigraph
|
||||
conversion are not performed. In addition, the <samp><span class="option">-dD</span></samp> option is
|
||||
implicitly enabled.
|
||||
|
||||
<p>With <samp><span class="option">-fpreprocessed</span></samp>, predefinition of command line and most
|
||||
builtin macros is disabled. Macros such as <code>__LINE__</code>, which are
|
||||
contextually dependent, are handled normally. This enables compilation of
|
||||
files previously preprocessed with <code>-E -fdirectives-only</code>.
|
||||
|
||||
<p>With both <samp><span class="option">-E</span></samp> and <samp><span class="option">-fpreprocessed</span></samp>, the rules for
|
||||
<samp><span class="option">-fpreprocessed</span></samp> take precedence. This enables full preprocessing of
|
||||
files previously preprocessed with <code>-E -fdirectives-only</code>.
|
||||
|
||||
<br><dt><code>-fdollars-in-identifiers</code><dd><a name="index-fdollars_002din_002didentifiers-169"></a><a name="fdollars_002din_002didentifiers"></a>Accept ‘<samp><span class="samp">$</span></samp>’ in identifiers.
|
||||
See <a href="Identifier-characters.html#Identifier-characters">Identifier characters</a>.
|
||||
|
||||
<br><dt><code>-fextended-identifiers</code><dd><a name="index-fextended_002didentifiers-170"></a>Accept universal character names in identifiers. This option is
|
||||
experimental; in a future version of GCC, it will be enabled by
|
||||
default for C99 and C++.
|
||||
|
||||
<br><dt><code>-fpreprocessed</code><dd><a name="index-fpreprocessed-171"></a>Indicate to the preprocessor that the input file has already been
|
||||
preprocessed. This suppresses things like macro expansion, trigraph
|
||||
conversion, escaped newline splicing, and processing of most directives.
|
||||
The preprocessor still recognizes and removes comments, so that you can
|
||||
pass a file preprocessed with <samp><span class="option">-C</span></samp> to the compiler without
|
||||
problems. In this mode the integrated preprocessor is little more than
|
||||
a tokenizer for the front ends.
|
||||
|
||||
<p><samp><span class="option">-fpreprocessed</span></samp> is implicit if the input file has one of the
|
||||
extensions ‘<samp><span class="samp">.i</span></samp>’, ‘<samp><span class="samp">.ii</span></samp>’ or ‘<samp><span class="samp">.mi</span></samp>’. These are the
|
||||
extensions that GCC uses for preprocessed files created by
|
||||
<samp><span class="option">-save-temps</span></samp>.
|
||||
|
||||
<br><dt><code>-ftabstop=</code><var>width</var><dd><a name="index-ftabstop-172"></a>Set the distance between tab stops. This helps the preprocessor report
|
||||
correct column numbers in warnings or errors, even if tabs appear on the
|
||||
line. If the value is less than 1 or greater than 100, the option is
|
||||
ignored. The default is 8.
|
||||
|
||||
<br><dt><code>-fexec-charset=</code><var>charset</var><dd><a name="index-fexec_002dcharset-173"></a><a name="index-character-set_002c-execution-174"></a>Set the execution character set, used for string and character
|
||||
constants. The default is UTF-8. <var>charset</var> can be any encoding
|
||||
supported by the system's <code>iconv</code> library routine.
|
||||
|
||||
<br><dt><code>-fwide-exec-charset=</code><var>charset</var><dd><a name="index-fwide_002dexec_002dcharset-175"></a><a name="index-character-set_002c-wide-execution-176"></a>Set the wide execution character set, used for wide string and
|
||||
character constants. The default is UTF-32 or UTF-16, whichever
|
||||
corresponds to the width of <code>wchar_t</code>. As with
|
||||
<samp><span class="option">-fexec-charset</span></samp>, <var>charset</var> can be any encoding supported
|
||||
by the system's <code>iconv</code> library routine; however, you will have
|
||||
problems with encodings that do not fit exactly in <code>wchar_t</code>.
|
||||
|
||||
<br><dt><code>-finput-charset=</code><var>charset</var><dd><a name="index-finput_002dcharset-177"></a><a name="index-character-set_002c-input-178"></a>Set the input character set, used for translation from the character
|
||||
set of the input file to the source character set used by GCC. If the
|
||||
locale does not specify, or GCC cannot get this information from the
|
||||
locale, the default is UTF-8. This can be overridden by either the locale
|
||||
or this command line option. Currently the command line option takes
|
||||
precedence if there's a conflict. <var>charset</var> can be any encoding
|
||||
supported by the system's <code>iconv</code> library routine.
|
||||
|
||||
<br><dt><code>-fworking-directory</code><dd><a name="index-fworking_002ddirectory-179"></a><a name="index-fno_002dworking_002ddirectory-180"></a>Enable generation of linemarkers in the preprocessor output that will
|
||||
let the compiler know the current working directory at the time of
|
||||
preprocessing. When this option is enabled, the preprocessor will
|
||||
emit, after the initial linemarker, a second linemarker with the
|
||||
current working directory followed by two slashes. GCC will use this
|
||||
directory, when it's present in the preprocessed input, as the
|
||||
directory emitted as the current working directory in some debugging
|
||||
information formats. This option is implicitly enabled if debugging
|
||||
information is enabled, but this can be inhibited with the negated
|
||||
form <samp><span class="option">-fno-working-directory</span></samp>. If the <samp><span class="option">-P</span></samp> flag is
|
||||
present in the command line, this option has no effect, since no
|
||||
<code>#line</code> directives are emitted whatsoever.
|
||||
|
||||
<br><dt><code>-fno-show-column</code><dd><a name="index-fno_002dshow_002dcolumn-181"></a>Do not print column numbers in diagnostics. This may be necessary if
|
||||
diagnostics are being scanned by a program that does not understand the
|
||||
column numbers, such as <samp><span class="command">dejagnu</span></samp>.
|
||||
|
||||
<br><dt><code>-A </code><var>predicate</var><code>=</code><var>answer</var><dd><a name="index-A-182"></a>Make an assertion with the predicate <var>predicate</var> and answer
|
||||
<var>answer</var>. This form is preferred to the older form <samp><span class="option">-A
|
||||
</span><var>predicate</var><span class="option">(</span><var>answer</var><span class="option">)</span></samp>, which is still supported, because
|
||||
it does not use shell special characters.
|
||||
See <a href="Obsolete-Features.html#Obsolete-Features">Obsolete Features</a>.
|
||||
|
||||
<br><dt><code>-A -</code><var>predicate</var><code>=</code><var>answer</var><dd>Cancel an assertion with the predicate <var>predicate</var> and answer
|
||||
<var>answer</var>.
|
||||
|
||||
<br><dt><code>-dCHARS</code><dd><var>CHARS</var> is a sequence of one or more of the following characters,
|
||||
and must not be preceded by a space. Other characters are interpreted
|
||||
by the compiler proper, or reserved for future versions of GCC, and so
|
||||
are silently ignored. If you specify characters whose behavior
|
||||
conflicts, the result is undefined.
|
||||
|
||||
<dl>
|
||||
<dt>‘<samp><span class="samp">M</span></samp>’<dd><a name="index-dM-183"></a>Instead of the normal output, generate a list of ‘<samp><span class="samp">#define</span></samp>’
|
||||
directives for all the macros defined during the execution of the
|
||||
preprocessor, including predefined macros. This gives you a way of
|
||||
finding out what is predefined in your version of the preprocessor.
|
||||
Assuming you have no file <samp><span class="file">foo.h</span></samp>, the command
|
||||
|
||||
<pre class="smallexample"> touch foo.h; cpp -dM foo.h
|
||||
</pre>
|
||||
<p class="noindent">will show all the predefined macros.
|
||||
|
||||
<p>If you use <samp><span class="option">-dM</span></samp> without the <samp><span class="option">-E</span></samp> option, <samp><span class="option">-dM</span></samp> is
|
||||
interpreted as a synonym for <samp><span class="option">-fdump-rtl-mach</span></samp>.
|
||||
See <a href="../gcc/Debugging-Options.html#Debugging-Options">Debugging Options</a>.
|
||||
|
||||
<br><dt>‘<samp><span class="samp">D</span></samp>’<dd><a name="index-dD-184"></a>Like ‘<samp><span class="samp">M</span></samp>’ except in two respects: it does <em>not</em> include the
|
||||
predefined macros, and it outputs <em>both</em> the ‘<samp><span class="samp">#define</span></samp>’
|
||||
directives and the result of preprocessing. Both kinds of output go to
|
||||
the standard output file.
|
||||
|
||||
<br><dt>‘<samp><span class="samp">N</span></samp>’<dd><a name="index-dN-185"></a>Like ‘<samp><span class="samp">D</span></samp>’, but emit only the macro names, not their expansions.
|
||||
|
||||
<br><dt>‘<samp><span class="samp">I</span></samp>’<dd><a name="index-dI-186"></a>Output ‘<samp><span class="samp">#include</span></samp>’ directives in addition to the result of
|
||||
preprocessing.
|
||||
|
||||
<br><dt>‘<samp><span class="samp">U</span></samp>’<dd><a name="index-dU-187"></a>Like ‘<samp><span class="samp">D</span></samp>’ except that only macros that are expanded, or whose
|
||||
definedness is tested in preprocessor directives, are output; the
|
||||
output is delayed until the use or test of the macro; and
|
||||
‘<samp><span class="samp">#undef</span></samp>’ directives are also output for macros tested but
|
||||
undefined at the time.
|
||||
</dl>
|
||||
|
||||
<br><dt><code>-P</code><dd><a name="index-P-188"></a>Inhibit generation of linemarkers in the output from the preprocessor.
|
||||
This might be useful when running the preprocessor on something that is
|
||||
not C code, and will be sent to a program which might be confused by the
|
||||
linemarkers.
|
||||
See <a href="Preprocessor-Output.html#Preprocessor-Output">Preprocessor Output</a>.
|
||||
|
||||
<br><dt><code>-C</code><dd><a name="index-C-189"></a>Do not discard comments. All comments are passed through to the output
|
||||
file, except for comments in processed directives, which are deleted
|
||||
along with the directive.
|
||||
|
||||
<p>You should be prepared for side effects when using <samp><span class="option">-C</span></samp>; it
|
||||
causes the preprocessor to treat comments as tokens in their own right.
|
||||
For example, comments appearing at the start of what would be a
|
||||
directive line have the effect of turning that line into an ordinary
|
||||
source line, since the first token on the line is no longer a ‘<samp><span class="samp">#</span></samp>’.
|
||||
|
||||
<br><dt><code>-CC</code><dd>Do not discard comments, including during macro expansion. This is
|
||||
like <samp><span class="option">-C</span></samp>, except that comments contained within macros are
|
||||
also passed through to the output file where the macro is expanded.
|
||||
|
||||
<p>In addition to the side-effects of the <samp><span class="option">-C</span></samp> option, the
|
||||
<samp><span class="option">-CC</span></samp> option causes all C++-style comments inside a macro
|
||||
to be converted to C-style comments. This is to prevent later use
|
||||
of that macro from inadvertently commenting out the remainder of
|
||||
the source line.
|
||||
|
||||
<p>The <samp><span class="option">-CC</span></samp> option is generally used to support lint comments.
|
||||
|
||||
<br><dt><code>-traditional-cpp</code><dd><a name="index-traditional_002dcpp-190"></a>Try to imitate the behavior of old-fashioned C preprocessors, as
|
||||
opposed to ISO C preprocessors.
|
||||
See <a href="Traditional-Mode.html#Traditional-Mode">Traditional Mode</a>.
|
||||
|
||||
<br><dt><code>-trigraphs</code><dd><a name="index-trigraphs-191"></a>Process trigraph sequences.
|
||||
See <a href="Initial-processing.html#Initial-processing">Initial processing</a>.
|
||||
|
||||
<br><dt><code>-remap</code><dd><a name="index-remap-192"></a>Enable special code to work around file systems which only permit very
|
||||
short file names, such as MS-DOS.
|
||||
|
||||
<dt><code>--help</code><dt><code>--target-help</code><dd><a name="index-help-193"></a><a name="index-target_002dhelp-194"></a>Print text describing all the command line options instead of
|
||||
preprocessing anything.
|
||||
|
||||
<br><dt><code>-v</code><dd><a name="index-v-195"></a>Verbose mode. Print out GNU CPP's version number at the beginning of
|
||||
execution, and report the final form of the include path.
|
||||
|
||||
<br><dt><code>-H</code><dd><a name="index-H-196"></a>Print the name of each header file used, in addition to other normal
|
||||
activities. Each name is indented to show how deep in the
|
||||
‘<samp><span class="samp">#include</span></samp>’ stack it is. Precompiled header files are also
|
||||
printed, even if they are found to be invalid; an invalid precompiled
|
||||
header file is printed with ‘<samp><span class="samp">...x</span></samp>’ and a valid one with ‘<samp><span class="samp">...!</span></samp>’ .
|
||||
|
||||
<br><dt><code>-version</code><dt><code>--version</code><dd><a name="index-version-197"></a>Print out GNU CPP's version number. With one dash, proceed to
|
||||
preprocess as normal. With two dashes, exit immediately.
|
||||
</dl>
|
||||
<!-- man end -->
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,135 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Line Control - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="Diagnostics.html#Diagnostics" title="Diagnostics">
|
||||
<link rel="next" href="Pragmas.html#Pragmas" title="Pragmas">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Line-Control"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Pragmas.html#Pragmas">Pragmas</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Diagnostics.html#Diagnostics">Diagnostics</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="chapter">6 Line Control</h2>
|
||||
|
||||
<p><a name="index-line-control-98"></a>
|
||||
The C preprocessor informs the C compiler of the location in your source
|
||||
code where each token came from. Presently, this is just the file name
|
||||
and line number. All the tokens resulting from macro expansion are
|
||||
reported as having appeared on the line of the source file where the
|
||||
outermost macro was used. We intend to be more accurate in the future.
|
||||
|
||||
<p>If you write a program which generates source code, such as the
|
||||
<samp><span class="command">bison</span></samp> parser generator, you may want to adjust the preprocessor's
|
||||
notion of the current file name and line number by hand. Parts of the
|
||||
output from <samp><span class="command">bison</span></samp> are generated from scratch, other parts come
|
||||
from a standard parser file. The rest are copied verbatim from
|
||||
<samp><span class="command">bison</span></samp>'s input. You would like compiler error messages and
|
||||
symbolic debuggers to be able to refer to <code>bison</code>'s input file.
|
||||
|
||||
<p><a name="index-g_t_0023line-99"></a><samp><span class="command">bison</span></samp> or any such program can arrange this by writing
|
||||
‘<samp><span class="samp">#line</span></samp>’ directives into the output file. ‘<samp><span class="samp">#line</span></samp>’ is a
|
||||
directive that specifies the original line number and source file name
|
||||
for subsequent input in the current preprocessor input file.
|
||||
‘<samp><span class="samp">#line</span></samp>’ has three variants:
|
||||
|
||||
<dl>
|
||||
<dt><code>#line </code><var>linenum</var><dd><var>linenum</var> is a non-negative decimal integer constant. It specifies
|
||||
the line number which should be reported for the following line of
|
||||
input. Subsequent lines are counted from <var>linenum</var>.
|
||||
|
||||
<br><dt><code>#line </code><var>linenum</var> <var>filename</var><dd><var>linenum</var> is the same as for the first form, and has the same
|
||||
effect. In addition, <var>filename</var> is a string constant. The
|
||||
following line and all subsequent lines are reported to come from the
|
||||
file it specifies, until something else happens to change that.
|
||||
<var>filename</var> is interpreted according to the normal rules for a string
|
||||
constant: backslash escapes are interpreted. This is different from
|
||||
‘<samp><span class="samp">#include</span></samp>’.
|
||||
|
||||
<p>Previous versions of CPP did not interpret escapes in ‘<samp><span class="samp">#line</span></samp>’;
|
||||
we have changed it because the standard requires they be interpreted,
|
||||
and most other compilers do.
|
||||
|
||||
<br><dt><code>#line </code><var>anything else</var><dd><var>anything else</var> is checked for macro calls, which are expanded.
|
||||
The result should match one of the above two forms.
|
||||
</dl>
|
||||
|
||||
<p>‘<samp><span class="samp">#line</span></samp>’ directives alter the results of the <code>__FILE__</code> and
|
||||
<code>__LINE__</code> predefined macros from that point on. See <a href="Standard-Predefined-Macros.html#Standard-Predefined-Macros">Standard Predefined Macros</a>. They do not have any effect on ‘<samp><span class="samp">#include</span></samp>’'s
|
||||
idea of the directory containing the current file. This is a change
|
||||
from GCC 2.95. Previously, a file reading
|
||||
|
||||
<pre class="smallexample"> #line 1 "../src/gram.y"
|
||||
#include "gram.h"
|
||||
</pre>
|
||||
<p>would search for <samp><span class="file">gram.h</span></samp> in <samp><span class="file">../src</span></samp>, then the <samp><span class="option">-I</span></samp>
|
||||
chain; the directory containing the physical source file would not be
|
||||
searched. In GCC 3.0 and later, the ‘<samp><span class="samp">#include</span></samp>’ is not affected by
|
||||
the presence of a ‘<samp><span class="samp">#line</span></samp>’ referring to a different directory.
|
||||
|
||||
<p>We made this change because the old behavior caused problems when
|
||||
generated source files were transported between machines. For instance,
|
||||
it is common practice to ship generated parsers with a source release,
|
||||
so that people building the distribution do not need to have yacc or
|
||||
Bison installed. These files frequently have ‘<samp><span class="samp">#line</span></samp>’ directives
|
||||
referring to the directory tree of the system where the distribution was
|
||||
created. If GCC tries to search for headers in those directories, the
|
||||
build is likely to fail.
|
||||
|
||||
<p>The new behavior can cause failures too, if the generated file is not
|
||||
in the same directory as its source and it attempts to include a header
|
||||
which would be visible searching from the directory containing the
|
||||
source file. However, this problem is easily solved with an additional
|
||||
<samp><span class="option">-I</span></samp> switch on the command line. The failures caused by the old
|
||||
semantics could sometimes be corrected only by editing the generated
|
||||
files, which is difficult and error-prone.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,152 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Macro Arguments - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macros.html#Macros" title="Macros">
|
||||
<link rel="prev" href="Function_002dlike-Macros.html#Function_002dlike-Macros" title="Function-like Macros">
|
||||
<link rel="next" href="Stringification.html#Stringification" title="Stringification">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Macro-Arguments"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Stringification.html#Stringification">Stringification</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Function_002dlike-Macros.html#Function_002dlike-Macros">Function-like Macros</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macros.html#Macros">Macros</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">3.3 Macro Arguments</h3>
|
||||
|
||||
<p><a name="index-arguments-46"></a><a name="index-macros-with-arguments-47"></a><a name="index-arguments-in-macro-definitions-48"></a>
|
||||
Function-like macros can take <dfn>arguments</dfn>, just like true functions.
|
||||
To define a macro that uses arguments, you insert <dfn>parameters</dfn>
|
||||
between the pair of parentheses in the macro definition that make the
|
||||
macro function-like. The parameters must be valid C identifiers,
|
||||
separated by commas and optionally whitespace.
|
||||
|
||||
<p>To invoke a macro that takes arguments, you write the name of the macro
|
||||
followed by a list of <dfn>actual arguments</dfn> in parentheses, separated
|
||||
by commas. The invocation of the macro need not be restricted to a
|
||||
single logical line—it can cross as many lines in the source file as
|
||||
you wish. The number of arguments you give must match the number of
|
||||
parameters in the macro definition. When the macro is expanded, each
|
||||
use of a parameter in its body is replaced by the tokens of the
|
||||
corresponding argument. (You need not use all of the parameters in the
|
||||
macro body.)
|
||||
|
||||
<p>As an example, here is a macro that computes the minimum of two numeric
|
||||
values, as it is defined in many C programs, and some uses.
|
||||
|
||||
<pre class="smallexample"> #define min(X, Y) ((X) < (Y) ? (X) : (Y))
|
||||
x = min(a, b); ==> x = ((a) < (b) ? (a) : (b));
|
||||
y = min(1, 2); ==> y = ((1) < (2) ? (1) : (2));
|
||||
z = min(a + 28, *p); ==> z = ((a + 28) < (*p) ? (a + 28) : (*p));
|
||||
</pre>
|
||||
<p class="noindent">(In this small example you can already see several of the dangers of
|
||||
macro arguments. See <a href="Macro-Pitfalls.html#Macro-Pitfalls">Macro Pitfalls</a>, for detailed explanations.)
|
||||
|
||||
<p>Leading and trailing whitespace in each argument is dropped, and all
|
||||
whitespace between the tokens of an argument is reduced to a single
|
||||
space. Parentheses within each argument must balance; a comma within
|
||||
such parentheses does not end the argument. However, there is no
|
||||
requirement for square brackets or braces to balance, and they do not
|
||||
prevent a comma from separating arguments. Thus,
|
||||
|
||||
<pre class="smallexample"> macro (array[x = y, x + 1])
|
||||
</pre>
|
||||
<p class="noindent">passes two arguments to <code>macro</code>: <code>array[x = y</code> and <code>x +
|
||||
1]</code>. If you want to supply <code>array[x = y, x + 1]</code> as an argument,
|
||||
you can write it as <code>array[(x = y, x + 1)]</code>, which is equivalent C
|
||||
code.
|
||||
|
||||
<p>All arguments to a macro are completely macro-expanded before they are
|
||||
substituted into the macro body. After substitution, the complete text
|
||||
is scanned again for macros to expand, including the arguments. This rule
|
||||
may seem strange, but it is carefully designed so you need not worry
|
||||
about whether any function call is actually a macro invocation. You can
|
||||
run into trouble if you try to be too clever, though. See <a href="Argument-Prescan.html#Argument-Prescan">Argument Prescan</a>, for detailed discussion.
|
||||
|
||||
<p>For example, <code>min (min (a, b), c)</code> is first expanded to
|
||||
|
||||
<pre class="smallexample"> min (((a) < (b) ? (a) : (b)), (c))
|
||||
</pre>
|
||||
<p class="noindent">and then to
|
||||
|
||||
<pre class="smallexample"> ((((a) < (b) ? (a) : (b))) < (c)
|
||||
? (((a) < (b) ? (a) : (b)))
|
||||
: (c))
|
||||
</pre>
|
||||
<p class="noindent">(Line breaks shown here for clarity would not actually be generated.)
|
||||
|
||||
<p><a name="index-empty-macro-arguments-49"></a>You can leave macro arguments empty; this is not an error to the
|
||||
preprocessor (but many macros will then expand to invalid code).
|
||||
You cannot leave out arguments entirely; if a macro takes two arguments,
|
||||
there must be exactly one comma at the top level of its argument list.
|
||||
Here are some silly examples using <code>min</code>:
|
||||
|
||||
<pre class="smallexample"> min(, b) ==> (( ) < (b) ? ( ) : (b))
|
||||
min(a, ) ==> ((a ) < ( ) ? (a ) : ( ))
|
||||
min(,) ==> (( ) < ( ) ? ( ) : ( ))
|
||||
min((,),) ==> (((,)) < ( ) ? ((,)) : ( ))
|
||||
|
||||
min() error--> macro "min" requires 2 arguments, but only 1 given
|
||||
min(,,) error--> macro "min" passed 3 arguments, but takes just 2
|
||||
</pre>
|
||||
<p>Whitespace is not a preprocessing token, so if a macro <code>foo</code> takes
|
||||
one argument, <code>foo ()<!-- /@w --></code> and <code>foo ( )<!-- /@w --></code> both supply it an
|
||||
empty argument. Previous GNU preprocessor implementations and
|
||||
documentation were incorrect on this point, insisting that a
|
||||
function-like macro that takes a single argument be passed a space if an
|
||||
empty argument was required.
|
||||
|
||||
<p>Macro parameters appearing inside string literals are not replaced by
|
||||
their corresponding actual arguments.
|
||||
|
||||
<pre class="smallexample"> #define foo(x) x, "x"
|
||||
foo(bar) ==> bar, "x"
|
||||
</pre>
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,77 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Macro Pitfalls - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macros.html#Macros" title="Macros">
|
||||
<link rel="prev" href="Directives-Within-Macro-Arguments.html#Directives-Within-Macro-Arguments" title="Directives Within Macro Arguments">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Macro-Pitfalls"></a>
|
||||
<p>
|
||||
Previous: <a rel="previous" accesskey="p" href="Directives-Within-Macro-Arguments.html#Directives-Within-Macro-Arguments">Directives Within Macro Arguments</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macros.html#Macros">Macros</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">3.10 Macro Pitfalls</h3>
|
||||
|
||||
<p><a name="index-problems-with-macros-72"></a><a name="index-pitfalls-of-macros-73"></a>
|
||||
In this section we describe some special rules that apply to macros and
|
||||
macro expansion, and point out certain cases in which the rules have
|
||||
counter-intuitive consequences that you must watch out for.
|
||||
|
||||
<ul class="menu">
|
||||
<li><a accesskey="1" href="Misnesting.html#Misnesting">Misnesting</a>
|
||||
<li><a accesskey="2" href="Operator-Precedence-Problems.html#Operator-Precedence-Problems">Operator Precedence Problems</a>
|
||||
<li><a accesskey="3" href="Swallowing-the-Semicolon.html#Swallowing-the-Semicolon">Swallowing the Semicolon</a>
|
||||
<li><a accesskey="4" href="Duplication-of-Side-Effects.html#Duplication-of-Side-Effects">Duplication of Side Effects</a>
|
||||
<li><a accesskey="5" href="Self_002dReferential-Macros.html#Self_002dReferential-Macros">Self-Referential Macros</a>
|
||||
<li><a accesskey="6" href="Argument-Prescan.html#Argument-Prescan">Argument Prescan</a>
|
||||
<li><a accesskey="7" href="Newlines-in-Arguments.html#Newlines-in-Arguments">Newlines in Arguments</a>
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,90 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Macros - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="Header-Files.html#Header-Files" title="Header Files">
|
||||
<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) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Macros"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Conditionals.html#Conditionals">Conditionals</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Header-Files.html#Header-Files">Header Files</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="chapter">3 Macros</h2>
|
||||
|
||||
<p>A <dfn>macro</dfn> is a fragment of code which has been given a name.
|
||||
Whenever the name is used, it is replaced by the contents of the macro.
|
||||
There are two kinds of macros. They differ mostly in what they look
|
||||
like when they are used. <dfn>Object-like</dfn> macros resemble data objects
|
||||
when used, <dfn>function-like</dfn> macros resemble function calls.
|
||||
|
||||
<p>You may define any valid identifier as a macro, even if it is a C
|
||||
keyword. The preprocessor does not know anything about keywords. This
|
||||
can be useful if you wish to hide a keyword such as <code>const</code> from an
|
||||
older compiler that does not understand it. However, the preprocessor
|
||||
operator <code>defined</code> (see <a href="Defined.html#Defined">Defined</a>) can never be defined as a
|
||||
macro, and C++'s named operators (see <a href="C_002b_002b-Named-Operators.html#C_002b_002b-Named-Operators">C++ Named Operators</a>) cannot be
|
||||
macros when you are compiling C++.
|
||||
|
||||
<ul class="menu">
|
||||
<li><a accesskey="1" href="Object_002dlike-Macros.html#Object_002dlike-Macros">Object-like Macros</a>
|
||||
<li><a accesskey="2" href="Function_002dlike-Macros.html#Function_002dlike-Macros">Function-like Macros</a>
|
||||
<li><a accesskey="3" href="Macro-Arguments.html#Macro-Arguments">Macro Arguments</a>
|
||||
<li><a accesskey="4" href="Stringification.html#Stringification">Stringification</a>
|
||||
<li><a accesskey="5" href="Concatenation.html#Concatenation">Concatenation</a>
|
||||
<li><a accesskey="6" href="Variadic-Macros.html#Variadic-Macros">Variadic Macros</a>
|
||||
<li><a accesskey="7" href="Predefined-Macros.html#Predefined-Macros">Predefined Macros</a>
|
||||
<li><a accesskey="8" href="Undefining-and-Redefining-Macros.html#Undefining-and-Redefining-Macros">Undefining and Redefining Macros</a>
|
||||
<li><a accesskey="9" href="Directives-Within-Macro-Arguments.html#Directives-Within-Macro-Arguments">Directives Within Macro Arguments</a>
|
||||
<li><a href="Macro-Pitfalls.html#Macro-Pitfalls">Macro Pitfalls</a>
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,88 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Misnesting - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macro-Pitfalls.html#Macro-Pitfalls" title="Macro Pitfalls">
|
||||
<link rel="next" href="Operator-Precedence-Problems.html#Operator-Precedence-Problems" title="Operator Precedence Problems">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Misnesting"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Operator-Precedence-Problems.html#Operator-Precedence-Problems">Operator Precedence Problems</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macro-Pitfalls.html#Macro-Pitfalls">Macro Pitfalls</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h4 class="subsection">3.10.1 Misnesting</h4>
|
||||
|
||||
<p>When a macro is called with arguments, the arguments are substituted
|
||||
into the macro body and the result is checked, together with the rest of
|
||||
the input file, for more macro calls. It is possible to piece together
|
||||
a macro call coming partially from the macro body and partially from the
|
||||
arguments. For example,
|
||||
|
||||
<pre class="smallexample"> #define twice(x) (2*(x))
|
||||
#define call_with_1(x) x(1)
|
||||
call_with_1 (twice)
|
||||
==> twice(1)
|
||||
==> (2*(1))
|
||||
</pre>
|
||||
<p>Macro definitions do not have to have balanced parentheses. By writing
|
||||
an unbalanced open parenthesis in a macro body, it is possible to create
|
||||
a macro call that begins inside the macro body but ends outside of it.
|
||||
For example,
|
||||
|
||||
<pre class="smallexample"> #define strange(file) fprintf (file, "%s %d",
|
||||
...
|
||||
strange(stderr) p, 35)
|
||||
==> fprintf (stderr, "%s %d", p, 35)
|
||||
</pre>
|
||||
<p>The ability to piece together a macro call can be useful, but the use of
|
||||
unbalanced open parentheses in a macro body is just confusing, and
|
||||
should be avoided.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,83 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Newlines in Arguments - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macro-Pitfalls.html#Macro-Pitfalls" title="Macro Pitfalls">
|
||||
<link rel="prev" href="Argument-Prescan.html#Argument-Prescan" title="Argument Prescan">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Newlines-in-Arguments"></a>
|
||||
<p>
|
||||
Previous: <a rel="previous" accesskey="p" href="Argument-Prescan.html#Argument-Prescan">Argument Prescan</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macro-Pitfalls.html#Macro-Pitfalls">Macro Pitfalls</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h4 class="subsection">3.10.7 Newlines in Arguments</h4>
|
||||
|
||||
<p><a name="index-newlines-in-macro-arguments-82"></a>
|
||||
The invocation of a function-like macro can extend over many logical
|
||||
lines. However, in the present implementation, the entire expansion
|
||||
comes out on one line. Thus line numbers emitted by the compiler or
|
||||
debugger refer to the line the invocation started on, which might be
|
||||
different to the line containing the argument causing the problem.
|
||||
|
||||
<p>Here is an example illustrating this:
|
||||
|
||||
<pre class="smallexample"> #define ignore_second_arg(a,b,c) a; c
|
||||
|
||||
ignore_second_arg (foo (),
|
||||
ignored (),
|
||||
syntax error);
|
||||
</pre>
|
||||
<p class="noindent">The syntax error triggered by the tokens <code>syntax error</code> results in
|
||||
an error message citing line three—the line of ignore_second_arg—
|
||||
even though the problematic code comes from line five.
|
||||
|
||||
<p>We consider this a bug, and intend to fix it in the near future.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,161 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Object-like Macros - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macros.html#Macros" title="Macros">
|
||||
<link rel="next" href="Function_002dlike-Macros.html#Function_002dlike-Macros" title="Function-like Macros">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Object-like-Macros"></a>
|
||||
<a name="Object_002dlike-Macros"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Function_002dlike-Macros.html#Function_002dlike-Macros">Function-like Macros</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macros.html#Macros">Macros</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">3.1 Object-like Macros</h3>
|
||||
|
||||
<p><a name="index-object_002dlike-macro-41"></a><a name="index-symbolic-constants-42"></a><a name="index-manifest-constants-43"></a>
|
||||
An <dfn>object-like macro</dfn> is a simple identifier which will be replaced
|
||||
by a code fragment. It is called object-like because it looks like a
|
||||
data object in code that uses it. They are most commonly used to give
|
||||
symbolic names to numeric constants.
|
||||
|
||||
<p><a name="index-g_t_0023define-44"></a>You create macros with the ‘<samp><span class="samp">#define</span></samp>’ directive. ‘<samp><span class="samp">#define</span></samp>’ is
|
||||
followed by the name of the macro and then the token sequence it should
|
||||
be an abbreviation for, which is variously referred to as the macro's
|
||||
<dfn>body</dfn>, <dfn>expansion</dfn> or <dfn>replacement list</dfn>. For example,
|
||||
|
||||
<pre class="smallexample"> #define BUFFER_SIZE 1024
|
||||
</pre>
|
||||
<p class="noindent">defines a macro named <code>BUFFER_SIZE</code> as an abbreviation for the
|
||||
token <code>1024</code>. If somewhere after this ‘<samp><span class="samp">#define</span></samp>’ directive
|
||||
there comes a C statement of the form
|
||||
|
||||
<pre class="smallexample"> foo = (char *) malloc (BUFFER_SIZE);
|
||||
</pre>
|
||||
<p class="noindent">then the C preprocessor will recognize and <dfn>expand</dfn> the macro
|
||||
<code>BUFFER_SIZE</code>. The C compiler will see the same tokens as it would
|
||||
if you had written
|
||||
|
||||
<pre class="smallexample"> foo = (char *) malloc (1024);
|
||||
</pre>
|
||||
<p>By convention, macro names are written in uppercase. Programs are
|
||||
easier to read when it is possible to tell at a glance which names are
|
||||
macros.
|
||||
|
||||
<p>The macro's body ends at the end of the ‘<samp><span class="samp">#define</span></samp>’ line. You may
|
||||
continue the definition onto multiple lines, if necessary, using
|
||||
backslash-newline. When the macro is expanded, however, it will all
|
||||
come out on one line. For example,
|
||||
|
||||
<pre class="smallexample"> #define NUMBERS 1, \
|
||||
2, \
|
||||
3
|
||||
int x[] = { NUMBERS };
|
||||
==> int x[] = { 1, 2, 3 };
|
||||
</pre>
|
||||
<p class="noindent">The most common visible consequence of this is surprising line numbers
|
||||
in error messages.
|
||||
|
||||
<p>There is no restriction on what can go in a macro body provided it
|
||||
decomposes into valid preprocessing tokens. Parentheses need not
|
||||
balance, and the body need not resemble valid C code. (If it does not,
|
||||
you may get error messages from the C compiler when you use the macro.)
|
||||
|
||||
<p>The C preprocessor scans your program sequentially. Macro definitions
|
||||
take effect at the place you write them. Therefore, the following input
|
||||
to the C preprocessor
|
||||
|
||||
<pre class="smallexample"> foo = X;
|
||||
#define X 4
|
||||
bar = X;
|
||||
</pre>
|
||||
<p class="noindent">produces
|
||||
|
||||
<pre class="smallexample"> foo = X;
|
||||
bar = 4;
|
||||
</pre>
|
||||
<p>When the preprocessor expands a macro name, the macro's expansion
|
||||
replaces the macro invocation, then the expansion is examined for more
|
||||
macros to expand. For example,
|
||||
|
||||
<pre class="smallexample"> #define TABLESIZE BUFSIZE
|
||||
#define BUFSIZE 1024
|
||||
TABLESIZE
|
||||
==> BUFSIZE
|
||||
==> 1024
|
||||
</pre>
|
||||
<p class="noindent"><code>TABLESIZE</code> is expanded first to produce <code>BUFSIZE</code>, then that
|
||||
macro is expanded to produce the final result, <code>1024</code>.
|
||||
|
||||
<p>Notice that <code>BUFSIZE</code> was not defined when <code>TABLESIZE</code> was
|
||||
defined. The ‘<samp><span class="samp">#define</span></samp>’ for <code>TABLESIZE</code> uses exactly the
|
||||
expansion you specify—in this case, <code>BUFSIZE</code>—and does not
|
||||
check to see whether it too contains macro names. Only when you
|
||||
<em>use</em> <code>TABLESIZE</code> is the result of its expansion scanned for
|
||||
more macro names.
|
||||
|
||||
<p>This makes a difference if you change the definition of <code>BUFSIZE</code>
|
||||
at some point in the source file. <code>TABLESIZE</code>, defined as shown,
|
||||
will always expand using the definition of <code>BUFSIZE</code> that is
|
||||
currently in effect:
|
||||
|
||||
<pre class="smallexample"> #define BUFSIZE 1020
|
||||
#define TABLESIZE BUFSIZE
|
||||
#undef BUFSIZE
|
||||
#define BUFSIZE 37
|
||||
</pre>
|
||||
<p class="noindent">Now <code>TABLESIZE</code> expands (in two stages) to <code>37</code>.
|
||||
|
||||
<p>If the expansion of a macro contains its own name, either directly or
|
||||
via intermediate macros, it is not expanded again when the expansion is
|
||||
examined for more macros. This prevents infinite recursion.
|
||||
See <a href="Self_002dReferential-Macros.html#Self_002dReferential-Macros">Self-Referential Macros</a>, for the precise details.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,132 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Obsolete Features - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Implementation-Details.html#Implementation-Details" title="Implementation Details">
|
||||
<link rel="prev" href="Implementation-limits.html#Implementation-limits" title="Implementation limits">
|
||||
<link rel="next" href="Differences-from-previous-versions.html#Differences-from-previous-versions" title="Differences from previous versions">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Obsolete-Features"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Differences-from-previous-versions.html#Differences-from-previous-versions">Differences from previous versions</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Implementation-limits.html#Implementation-limits">Implementation limits</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Implementation-Details.html#Implementation-Details">Implementation Details</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">11.3 Obsolete Features</h3>
|
||||
|
||||
<p>CPP has some features which are present mainly for compatibility with
|
||||
older programs. We discourage their use in new code. In some cases,
|
||||
we plan to remove the feature in a future version of GCC.
|
||||
|
||||
<h4 class="subsection">11.3.1 Assertions</h4>
|
||||
|
||||
<p><a name="index-assertions-111"></a>
|
||||
<dfn>Assertions</dfn> are a deprecated alternative to macros in writing
|
||||
conditionals to test what sort of computer or system the compiled
|
||||
program will run on. Assertions are usually predefined, but you can
|
||||
define them with preprocessing directives or command-line options.
|
||||
|
||||
<p>Assertions were intended to provide a more systematic way to describe
|
||||
the compiler's target system. However, in practice they are just as
|
||||
unpredictable as the system-specific predefined macros. In addition, they
|
||||
are not part of any standard, and only a few compilers support them.
|
||||
Therefore, the use of assertions is <strong>less</strong> portable than the use
|
||||
of system-specific predefined macros. We recommend you do not use them at
|
||||
all.
|
||||
|
||||
<p><a name="index-predicates-112"></a>An assertion looks like this:
|
||||
|
||||
<pre class="smallexample"> #<var>predicate</var> (<var>answer</var>)
|
||||
</pre>
|
||||
<p class="noindent"><var>predicate</var> must be a single identifier. <var>answer</var> can be any
|
||||
sequence of tokens; all characters are significant except for leading
|
||||
and trailing whitespace, and differences in internal whitespace
|
||||
sequences are ignored. (This is similar to the rules governing macro
|
||||
redefinition.) Thus, <code>(x + y)</code> is different from <code>(x+y)</code> but
|
||||
equivalent to <code>( x + y )<!-- /@w --></code>. Parentheses do not nest inside an
|
||||
answer.
|
||||
|
||||
<p><a name="index-testing-predicates-113"></a>To test an assertion, you write it in an ‘<samp><span class="samp">#if</span></samp>’. For example, this
|
||||
conditional succeeds if either <code>vax</code> or <code>ns16000</code> has been
|
||||
asserted as an answer for <code>machine</code>.
|
||||
|
||||
<pre class="smallexample"> #if #machine (vax) || #machine (ns16000)
|
||||
</pre>
|
||||
<p class="noindent">You can test whether <em>any</em> answer is asserted for a predicate by
|
||||
omitting the answer in the conditional:
|
||||
|
||||
<pre class="smallexample"> #if #machine
|
||||
</pre>
|
||||
<p><a name="index-g_t_0023assert-114"></a>Assertions are made with the ‘<samp><span class="samp">#assert</span></samp>’ directive. Its sole
|
||||
argument is the assertion to make, without the leading ‘<samp><span class="samp">#</span></samp>’ that
|
||||
identifies assertions in conditionals.
|
||||
|
||||
<pre class="smallexample"> #assert <var>predicate</var> (<var>answer</var>)
|
||||
</pre>
|
||||
<p class="noindent">You may make several assertions with the same predicate and different
|
||||
answers. Subsequent assertions do not override previous ones for the
|
||||
same predicate. All the answers for any given predicate are
|
||||
simultaneously true.
|
||||
|
||||
<p><a name="index-assertions_002c-canceling-115"></a><a name="index-g_t_0023unassert-116"></a>Assertions can be canceled with the ‘<samp><span class="samp">#unassert</span></samp>’ directive. It
|
||||
has the same syntax as ‘<samp><span class="samp">#assert</span></samp>’. In that form it cancels only the
|
||||
answer which was specified on the ‘<samp><span class="samp">#unassert</span></samp>’ line; other answers
|
||||
for that predicate remain true. You can cancel an entire predicate by
|
||||
leaving out the answer:
|
||||
|
||||
<pre class="smallexample"> #unassert <var>predicate</var>
|
||||
</pre>
|
||||
<p class="noindent">In either form, if no such assertion has been made, ‘<samp><span class="samp">#unassert</span></samp>’ has
|
||||
no effect.
|
||||
|
||||
<p>You can also make or cancel assertions using command line options.
|
||||
See <a href="Invocation.html#Invocation">Invocation</a>.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,103 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Once-Only Headers - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Header-Files.html#Header-Files" title="Header Files">
|
||||
<link rel="prev" href="Search-Path.html#Search-Path" title="Search Path">
|
||||
<link rel="next" href="Alternatives-to-Wrapper-_0023ifndef.html#Alternatives-to-Wrapper-_0023ifndef" title="Alternatives to Wrapper #ifndef">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Once-Only-Headers"></a>
|
||||
<a name="Once_002dOnly-Headers"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Alternatives-to-Wrapper-_0023ifndef.html#Alternatives-to-Wrapper-_0023ifndef">Alternatives to Wrapper #ifndef</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Search-Path.html#Search-Path">Search Path</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Header-Files.html#Header-Files">Header Files</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">2.4 Once-Only Headers</h3>
|
||||
|
||||
<p><a name="index-repeated-inclusion-28"></a><a name="index-including-just-once-29"></a><a name="index-wrapper-_0040code_007b_0023ifndef_007d-30"></a>
|
||||
If a header file happens to be included twice, the compiler will process
|
||||
its contents twice. This is very likely to cause an error, e.g. when the
|
||||
compiler sees the same structure definition twice. Even if it does not,
|
||||
it will certainly waste time.
|
||||
|
||||
<p>The standard way to prevent this is to enclose the entire real contents
|
||||
of the file in a conditional, like this:
|
||||
|
||||
<pre class="smallexample"> /* File foo. */
|
||||
#ifndef FILE_FOO_SEEN
|
||||
#define FILE_FOO_SEEN
|
||||
|
||||
<var>the entire file</var>
|
||||
|
||||
#endif /* !FILE_FOO_SEEN */
|
||||
</pre>
|
||||
<p>This construct is commonly known as a <dfn>wrapper #ifndef</dfn>.
|
||||
When the header is included again, the conditional will be false,
|
||||
because <code>FILE_FOO_SEEN</code> is defined. The preprocessor will skip
|
||||
over the entire contents of the file, and the compiler will not see it
|
||||
twice.
|
||||
|
||||
<p>CPP optimizes even further. It remembers when a header file has a
|
||||
wrapper ‘<samp><span class="samp">#ifndef</span></samp>’. If a subsequent ‘<samp><span class="samp">#include</span></samp>’ specifies that
|
||||
header, and the macro in the ‘<samp><span class="samp">#ifndef</span></samp>’ is still defined, it does
|
||||
not bother to rescan the file at all.
|
||||
|
||||
<p>You can put comments outside the wrapper. They will not interfere with
|
||||
this optimization.
|
||||
|
||||
<p><a name="index-controlling-macro-31"></a><a name="index-guard-macro-32"></a>The macro <code>FILE_FOO_SEEN</code> is called the <dfn>controlling macro</dfn> or
|
||||
<dfn>guard macro</dfn>. In a user header file, the macro name should not
|
||||
begin with ‘<samp><span class="samp">_</span></samp>’. In a system header file, it should begin with
|
||||
‘<samp><span class="samp">__</span></samp>’ to avoid conflicts with user programs. In any kind of header
|
||||
file, the macro name should contain the name of the file and some
|
||||
additional text, to avoid conflicts with other header files.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,113 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Operator Precedence Problems - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macro-Pitfalls.html#Macro-Pitfalls" title="Macro Pitfalls">
|
||||
<link rel="prev" href="Misnesting.html#Misnesting" title="Misnesting">
|
||||
<link rel="next" href="Swallowing-the-Semicolon.html#Swallowing-the-Semicolon" title="Swallowing the Semicolon">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Operator-Precedence-Problems"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Swallowing-the-Semicolon.html#Swallowing-the-Semicolon">Swallowing the Semicolon</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Misnesting.html#Misnesting">Misnesting</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macro-Pitfalls.html#Macro-Pitfalls">Macro Pitfalls</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h4 class="subsection">3.10.2 Operator Precedence Problems</h4>
|
||||
|
||||
<p><a name="index-parentheses-in-macro-bodies-74"></a>
|
||||
You may have noticed that in most of the macro definition examples shown
|
||||
above, each occurrence of a macro argument name had parentheses around
|
||||
it. In addition, another pair of parentheses usually surround the
|
||||
entire macro definition. Here is why it is best to write macros that
|
||||
way.
|
||||
|
||||
<p>Suppose you define a macro as follows,
|
||||
|
||||
<pre class="smallexample"> #define ceil_div(x, y) (x + y - 1) / y
|
||||
</pre>
|
||||
<p class="noindent">whose purpose is to divide, rounding up. (One use for this operation is
|
||||
to compute how many <code>int</code> objects are needed to hold a certain
|
||||
number of <code>char</code> objects.) Then suppose it is used as follows:
|
||||
|
||||
<pre class="smallexample"> a = ceil_div (b & c, sizeof (int));
|
||||
==> a = (b & c + sizeof (int) - 1) / sizeof (int);
|
||||
</pre>
|
||||
<p class="noindent">This does not do what is intended. The operator-precedence rules of
|
||||
C make it equivalent to this:
|
||||
|
||||
<pre class="smallexample"> a = (b & (c + sizeof (int) - 1)) / sizeof (int);
|
||||
</pre>
|
||||
<p class="noindent">What we want is this:
|
||||
|
||||
<pre class="smallexample"> a = ((b & c) + sizeof (int) - 1)) / sizeof (int);
|
||||
</pre>
|
||||
<p class="noindent">Defining the macro as
|
||||
|
||||
<pre class="smallexample"> #define ceil_div(x, y) ((x) + (y) - 1) / (y)
|
||||
</pre>
|
||||
<p class="noindent">provides the desired result.
|
||||
|
||||
<p>Unintended grouping can result in another way. Consider <code>sizeof
|
||||
ceil_div(1, 2)</code>. That has the appearance of a C expression that would
|
||||
compute the size of the type of <code>ceil_div (1, 2)</code>, but in fact it
|
||||
means something very different. Here is what it expands to:
|
||||
|
||||
<pre class="smallexample"> sizeof ((1) + (2) - 1) / (2)
|
||||
</pre>
|
||||
<p class="noindent">This would take the size of an integer and divide it by two. The
|
||||
precedence rules have put the division outside the <code>sizeof</code> when it
|
||||
was intended to be inside.
|
||||
|
||||
<p>Parentheses around the entire macro definition prevent such problems.
|
||||
Here, then, is the recommended way to define <code>ceil_div</code>:
|
||||
|
||||
<pre class="smallexample"> #define ceil_div(x, y) (((x) + (y) - 1) / (y))
|
||||
</pre>
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,145 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Option Index - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="Index-of-Directives.html#Index-of-Directives" title="Index of Directives">
|
||||
<link rel="next" href="Concept-Index.html#Concept-Index" title="Concept Index">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Option-Index"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Concept-Index.html#Concept-Index">Concept Index</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Index-of-Directives.html#Index-of-Directives">Index of Directives</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="unnumbered">Option Index</h2>
|
||||
|
||||
<p class="noindent">CPP's command line options and environment variables are indexed here
|
||||
without any initial ‘<samp><span class="samp">-</span></samp>’ or ‘<samp><span class="samp">--</span></samp>’.
|
||||
|
||||
|
||||
|
||||
<ul class="index-op" compact>
|
||||
<li><a href="Invocation.html#index-A-182"><code>A</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-ansi-153"><code>ansi</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-C-189"><code>C</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Environment-Variables.html#index-C_005fINCLUDE_005fPATH-200"><code>C_INCLUDE_PATH</code></a>: <a href="Environment-Variables.html#Environment-Variables">Environment Variables</a></li>
|
||||
<li><a href="Environment-Variables.html#index-CPATH-199"><code>CPATH</code></a>: <a href="Environment-Variables.html#Environment-Variables">Environment Variables</a></li>
|
||||
<li><a href="Environment-Variables.html#index-CPLUS_005fINCLUDE_005fPATH-201"><code>CPLUS_INCLUDE_PATH</code></a>: <a href="Environment-Variables.html#Environment-Variables">Environment Variables</a></li>
|
||||
<li><a href="Invocation.html#index-D-123"><code>D</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-dD-184"><code>dD</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Environment-Variables.html#index-DEPENDENCIES_005fOUTPUT-203"><code>DEPENDENCIES_OUTPUT</code></a>: <a href="Environment-Variables.html#Environment-Variables">Environment Variables</a></li>
|
||||
<li><a href="Invocation.html#index-dI-186"><code>dI</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-dM-183"><code>dM</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-dN-185"><code>dN</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-dU-187"><code>dU</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-fdirectives_002donly-168"><code>fdirectives-only</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-fdollars_002din_002didentifiers-169"><code>fdollars-in-identifiers</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-fexec_002dcharset-173"><code>fexec-charset</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-fextended_002didentifiers-170"><code>fextended-identifiers</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-finput_002dcharset-177"><code>finput-charset</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-fno_002dshow_002dcolumn-181"><code>fno-show-column</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-fno_002dworking_002ddirectory-180"><code>fno-working-directory</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-fpreprocessed-171"><code>fpreprocessed</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-ftabstop-172"><code>ftabstop</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-fwide_002dexec_002dcharset-175"><code>fwide-exec-charset</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-fworking_002ddirectory-179"><code>fworking-directory</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-H-196"><code>H</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-help-193"><code>help</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-I-126"><code>I</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-I_002d-155"><code>I-</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-idirafter-160"><code>idirafter</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-imacros-159"><code>imacros</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-imultilib-165"><code>imultilib</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-include-158"><code>include</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-iprefix-161"><code>iprefix</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-iquote-167"><code>iquote</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-isysroot-164"><code>isysroot</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-isystem-166"><code>isystem</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-iwithprefix-162"><code>iwithprefix</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-iwithprefixbefore-163"><code>iwithprefixbefore</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-M-141"><code>M</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-MD-150"><code>MD</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-MF-145"><code>MF</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-MG-146"><code>MG</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-MM-144"><code>MM</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-MMD-151"><code>MMD</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-MP-147"><code>MP</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-MQ-149"><code>MQ</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-MT-148"><code>MT</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-nostdinc-156"><code>nostdinc</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-nostdinc_002b_002b-157"><code>nostdinc++</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-o-127"><code>o</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Environment-Variables.html#index-OBJC_005fINCLUDE_005fPATH-202"><code>OBJC_INCLUDE_PATH</code></a>: <a href="Environment-Variables.html#Environment-Variables">Environment Variables</a></li>
|
||||
<li><a href="Invocation.html#index-P-188"><code>P</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-pedantic-139"><code>pedantic</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-pedantic_002derrors-140"><code>pedantic-errors</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-remap-192"><code>remap</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-std_003d-154"><code>std=</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Environment-Variables.html#index-SUNPRO_005fDEPENDENCIES-205"><code>SUNPRO_DEPENDENCIES</code></a>: <a href="Environment-Variables.html#Environment-Variables">Environment Variables</a></li>
|
||||
<li><a href="Invocation.html#index-target_002dhelp-194"><code>target-help</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-traditional_002dcpp-190"><code>traditional-cpp</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-trigraphs-191"><code>trigraphs</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-U-124"><code>U</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-undef-125"><code>undef</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-v-195"><code>v</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-version-197"><code>version</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-w-138"><code>w</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-Wall-128"><code>Wall</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-Wcomment-129"><code>Wcomment</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-Wcomments-130"><code>Wcomments</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-Wendif_002dlabels-135"><code>Wendif-labels</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-Werror-136"><code>Werror</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-Wsystem_002dheaders-137"><code>Wsystem-headers</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-Wtraditional-132"><code>Wtraditional</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-Wtrigraphs-131"><code>Wtrigraphs</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-Wundef-133"><code>Wundef</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-Wunused_002dmacros-134"><code>Wunused-macros</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
<li><a href="Invocation.html#index-x-152"><code>x</code></a>: <a href="Invocation.html#Invocation">Invocation</a></li>
|
||||
</ul> </body></html>
|
||||
|
@@ -0,0 +1,80 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Other Directives - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="Pragmas.html#Pragmas" title="Pragmas">
|
||||
<link rel="next" href="Preprocessor-Output.html#Preprocessor-Output" title="Preprocessor Output">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Other-Directives"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Preprocessor-Output.html#Preprocessor-Output">Preprocessor Output</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Pragmas.html#Pragmas">Pragmas</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="chapter">8 Other Directives</h2>
|
||||
|
||||
<p><a name="index-g_t_0023ident-104"></a><a name="index-g_t_0023sccs-105"></a>The ‘<samp><span class="samp">#ident</span></samp>’ directive takes one argument, a string constant. On
|
||||
some systems, that string constant is copied into a special segment of
|
||||
the object file. On other systems, the directive is ignored. The
|
||||
‘<samp><span class="samp">#sccs</span></samp>’ directive is a synonym for ‘<samp><span class="samp">#ident</span></samp>’.
|
||||
|
||||
<p>These directives are not part of the C standard, but they are not
|
||||
official GNU extensions either. What historical information we have
|
||||
been able to find, suggests they originated with System V.
|
||||
|
||||
<p><a name="index-null-directive-106"></a>The <dfn>null directive</dfn> consists of a ‘<samp><span class="samp">#</span></samp>’ followed by a newline,
|
||||
with only whitespace (including comments) in between. A null directive
|
||||
is understood as a preprocessing directive but has no effect on the
|
||||
preprocessor output. The primary significance of the existence of the
|
||||
null directive is that an input line consisting of just a ‘<samp><span class="samp">#</span></samp>’ will
|
||||
produce no output, rather than a line of output containing just a
|
||||
‘<samp><span class="samp">#</span></samp>’. Supposedly some old C programs contain such lines.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,119 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Overview - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="index.html#Top" title="Top">
|
||||
<link rel="next" href="Header-Files.html#Header-Files" title="Header Files">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Overview"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Header-Files.html#Header-Files">Header Files</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="index.html#Top">Top</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="chapter">1 Overview</h2>
|
||||
|
||||
<!-- man begin DESCRIPTION -->
|
||||
<p>The C preprocessor, often known as <dfn>cpp</dfn>, is a <dfn>macro processor</dfn>
|
||||
that is used automatically by the C compiler to transform your program
|
||||
before compilation. It is called a macro processor because it allows
|
||||
you to define <dfn>macros</dfn>, which are brief abbreviations for longer
|
||||
constructs.
|
||||
|
||||
<p>The C preprocessor is intended to be used only with C, C++, and
|
||||
Objective-C source code. In the past, it has been abused as a general
|
||||
text processor. It will choke on input which does not obey C's lexical
|
||||
rules. For example, apostrophes will be interpreted as the beginning of
|
||||
character constants, and cause errors. Also, you cannot rely on it
|
||||
preserving characteristics of the input which are not significant to
|
||||
C-family languages. If a Makefile is preprocessed, all the hard tabs
|
||||
will be removed, and the Makefile will not work.
|
||||
|
||||
<p>Having said that, you can often get away with using cpp on things which
|
||||
are not C. Other Algol-ish programming languages are often safe
|
||||
(Pascal, Ada, etc.) So is assembly, with caution. <samp><span class="option">-traditional-cpp</span></samp>
|
||||
mode preserves more white space, and is otherwise more permissive. Many
|
||||
of the problems can be avoided by writing C or C++ style comments
|
||||
instead of native language comments, and keeping macros simple.
|
||||
|
||||
<p>Wherever possible, you should use a preprocessor geared to the language
|
||||
you are writing in. Modern versions of the GNU assembler have macro
|
||||
facilities. Most high level programming languages have their own
|
||||
conditional compilation and inclusion mechanism. If all else fails,
|
||||
try a true general text processor, such as GNU M4.
|
||||
|
||||
<p>C preprocessors vary in some details. This manual discusses the GNU C
|
||||
preprocessor, which provides a small superset of the features of ISO
|
||||
Standard C. In its default mode, the GNU C preprocessor does not do a
|
||||
few things required by the standard. These are features which are
|
||||
rarely, if ever, used, and may cause surprising changes to the meaning
|
||||
of a program which does not expect them. To get strict ISO Standard C,
|
||||
you should use the <samp><span class="option">-std=c90</span></samp> or <samp><span class="option">-std=c99</span></samp> options, depending
|
||||
on which version of the standard you want. To get all the mandatory
|
||||
diagnostics, you must also use <samp><span class="option">-pedantic</span></samp>. See <a href="Invocation.html#Invocation">Invocation</a>.
|
||||
|
||||
<p>This manual describes the behavior of the ISO preprocessor. To
|
||||
minimize gratuitous differences, where the ISO preprocessor's
|
||||
behavior does not conflict with traditional semantics, the
|
||||
traditional preprocessor should behave the same way. The various
|
||||
differences that do exist are detailed in the section <a href="Traditional-Mode.html#Traditional-Mode">Traditional Mode</a>.
|
||||
|
||||
<p>For clarity, unless noted otherwise, references to ‘<samp><span class="samp">CPP</span></samp>’ in this
|
||||
manual refer to GNU CPP.
|
||||
<!-- man end -->
|
||||
|
||||
<ul class="menu">
|
||||
<li><a accesskey="1" href="Character-sets.html#Character-sets">Character sets</a>
|
||||
<li><a accesskey="2" href="Initial-processing.html#Initial-processing">Initial processing</a>
|
||||
<li><a accesskey="3" href="Tokenization.html#Tokenization">Tokenization</a>
|
||||
<li><a accesskey="4" href="The-preprocessing-language.html#The-preprocessing-language">The preprocessing language</a>
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,158 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Pragmas - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="Line-Control.html#Line-Control" title="Line Control">
|
||||
<link rel="next" href="Other-Directives.html#Other-Directives" title="Other Directives">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Pragmas"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Other-Directives.html#Other-Directives">Other Directives</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Line-Control.html#Line-Control">Line Control</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="chapter">7 Pragmas</h2>
|
||||
|
||||
<p>The ‘<samp><span class="samp">#pragma</span></samp>’ directive is the method specified by the C standard
|
||||
for providing additional information to the compiler, beyond what is
|
||||
conveyed in the language itself. Three forms of this directive
|
||||
(commonly known as <dfn>pragmas</dfn>) are specified by the 1999 C standard.
|
||||
A C compiler is free to attach any meaning it likes to other pragmas.
|
||||
|
||||
<p>GCC has historically preferred to use extensions to the syntax of the
|
||||
language, such as <code>__attribute__</code>, for this purpose. However, GCC
|
||||
does define a few pragmas of its own. These mostly have effects on the
|
||||
entire translation unit or source file.
|
||||
|
||||
<p>In GCC version 3, all GNU-defined, supported pragmas have been given a
|
||||
<code>GCC</code> prefix. This is in line with the <code>STDC</code> prefix on all
|
||||
pragmas defined by C99. For backward compatibility, pragmas which were
|
||||
recognized by previous versions are still recognized without the
|
||||
<code>GCC</code> prefix, but that usage is deprecated. Some older pragmas are
|
||||
deprecated in their entirety. They are not recognized with the
|
||||
<code>GCC</code> prefix. See <a href="Obsolete-Features.html#Obsolete-Features">Obsolete Features</a>.
|
||||
|
||||
<p><a name="index-g_t_0040code_007b_005fPragma_007d-100"></a>C99 introduces the <code>_Pragma<!-- /@w --></code> operator. This feature addresses a
|
||||
major problem with ‘<samp><span class="samp">#pragma</span></samp>’: being a directive, it cannot be
|
||||
produced as the result of macro expansion. <code>_Pragma<!-- /@w --></code> is an
|
||||
operator, much like <code>sizeof</code> or <code>defined</code>, and can be embedded
|
||||
in a macro.
|
||||
|
||||
<p>Its syntax is <code>_Pragma (</code><var>string-literal</var><code>)<!-- /@w --></code>, where
|
||||
<var>string-literal</var> can be either a normal or wide-character string
|
||||
literal. It is destringized, by replacing all ‘<samp><span class="samp">\\</span></samp>’ with a single
|
||||
‘<samp><span class="samp">\</span></samp>’ and all ‘<samp><span class="samp">\"</span></samp>’ with a ‘<samp><span class="samp">"</span></samp>’. The result is then
|
||||
processed as if it had appeared as the right hand side of a
|
||||
‘<samp><span class="samp">#pragma</span></samp>’ directive. For example,
|
||||
|
||||
<pre class="smallexample"> _Pragma ("GCC dependency \"parse.y\"")
|
||||
</pre>
|
||||
<p class="noindent">has the same effect as <code>#pragma GCC dependency "parse.y"</code>. The
|
||||
same effect could be achieved using macros, for example
|
||||
|
||||
<pre class="smallexample"> #define DO_PRAGMA(x) _Pragma (#x)
|
||||
DO_PRAGMA (GCC dependency "parse.y")
|
||||
</pre>
|
||||
<p>The standard is unclear on where a <code>_Pragma</code> operator can appear.
|
||||
The preprocessor does not accept it within a preprocessing conditional
|
||||
directive like ‘<samp><span class="samp">#if</span></samp>’. To be safe, you are probably best keeping it
|
||||
out of directives other than ‘<samp><span class="samp">#define</span></samp>’, and putting it on a line of
|
||||
its own.
|
||||
|
||||
<p>This manual documents the pragmas which are meaningful to the
|
||||
preprocessor itself. Other pragmas are meaningful to the C or C++
|
||||
compilers. They are documented in the GCC manual.
|
||||
|
||||
<p>GCC plugins may provide their own pragmas.
|
||||
|
||||
<dl>
|
||||
<dt><code>#pragma GCC dependency</code><a name="index-g_t_0023pragma-GCC-dependency-101"></a><dd><code>#pragma GCC dependency</code> allows you to check the relative dates of
|
||||
the current file and another file. If the other file is more recent than
|
||||
the current file, a warning is issued. This is useful if the current
|
||||
file is derived from the other file, and should be regenerated. The
|
||||
other file is searched for using the normal include search path.
|
||||
Optional trailing text can be used to give more information in the
|
||||
warning message.
|
||||
|
||||
<pre class="smallexample"> #pragma GCC dependency "parse.y"
|
||||
#pragma GCC dependency "/usr/include/time.h" rerun fixincludes
|
||||
</pre>
|
||||
<br><dt><code>#pragma GCC poison</code><a name="index-g_t_0023pragma-GCC-poison-102"></a><dd>Sometimes, there is an identifier that you want to remove completely
|
||||
from your program, and make sure that it never creeps back in. To
|
||||
enforce this, you can <dfn>poison</dfn> the identifier with this pragma.
|
||||
<code>#pragma GCC poison</code> is followed by a list of identifiers to
|
||||
poison. If any of those identifiers appears anywhere in the source
|
||||
after the directive, it is a hard error. For example,
|
||||
|
||||
<pre class="smallexample"> #pragma GCC poison printf sprintf fprintf
|
||||
sprintf(some_string, "hello");
|
||||
</pre>
|
||||
<p class="noindent">will produce an error.
|
||||
|
||||
<p>If a poisoned identifier appears as part of the expansion of a macro
|
||||
which was defined before the identifier was poisoned, it will <em>not</em>
|
||||
cause an error. This lets you poison an identifier without worrying
|
||||
about system headers defining macros that use it.
|
||||
|
||||
<p>For example,
|
||||
|
||||
<pre class="smallexample"> #define strrchr rindex
|
||||
#pragma GCC poison rindex
|
||||
strrchr(some_string, 'h');
|
||||
</pre>
|
||||
<p class="noindent">will not produce an error.
|
||||
|
||||
<br><dt><code>#pragma GCC system_header</code><a name="index-g_t_0023pragma-GCC-system_005fheader-103"></a><dd>This pragma takes no arguments. It causes the rest of the code in the
|
||||
current file to be treated as if it came from a system header.
|
||||
See <a href="System-Headers.html#System-Headers">System Headers</a>.
|
||||
|
||||
</dl>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,78 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Predefined Macros - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macros.html#Macros" title="Macros">
|
||||
<link rel="prev" href="Variadic-Macros.html#Variadic-Macros" title="Variadic Macros">
|
||||
<link rel="next" href="Undefining-and-Redefining-Macros.html#Undefining-and-Redefining-Macros" title="Undefining and Redefining Macros">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Predefined-Macros"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Undefining-and-Redefining-Macros.html#Undefining-and-Redefining-Macros">Undefining and Redefining Macros</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Variadic-Macros.html#Variadic-Macros">Variadic Macros</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macros.html#Macros">Macros</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">3.7 Predefined Macros</h3>
|
||||
|
||||
<p><a name="index-predefined-macros-59"></a>Several object-like macros are predefined; you use them without
|
||||
supplying their definitions. They fall into three classes: standard,
|
||||
common, and system-specific.
|
||||
|
||||
<p>In C++, there is a fourth category, the named operators. They act like
|
||||
predefined macros, but you cannot undefine them.
|
||||
|
||||
<ul class="menu">
|
||||
<li><a accesskey="1" href="Standard-Predefined-Macros.html#Standard-Predefined-Macros">Standard Predefined Macros</a>
|
||||
<li><a accesskey="2" href="Common-Predefined-Macros.html#Common-Predefined-Macros">Common Predefined Macros</a>
|
||||
<li><a accesskey="3" href="System_002dspecific-Predefined-Macros.html#System_002dspecific-Predefined-Macros">System-specific Predefined Macros</a>
|
||||
<li><a accesskey="4" href="C_002b_002b-Named-Operators.html#C_002b_002b-Named-Operators">C++ Named Operators</a>
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,127 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Preprocessor Output - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="Other-Directives.html#Other-Directives" title="Other Directives">
|
||||
<link rel="next" href="Traditional-Mode.html#Traditional-Mode" title="Traditional Mode">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Preprocessor-Output"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Traditional-Mode.html#Traditional-Mode">Traditional Mode</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Other-Directives.html#Other-Directives">Other Directives</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="chapter">9 Preprocessor Output</h2>
|
||||
|
||||
<p>When the C preprocessor is used with the C, C++, or Objective-C
|
||||
compilers, it is integrated into the compiler and communicates a stream
|
||||
of binary tokens directly to the compiler's parser. However, it can
|
||||
also be used in the more conventional standalone mode, where it produces
|
||||
textual output.
|
||||
<!-- FIXME: Document the library interface. -->
|
||||
|
||||
<p><a name="index-output-format-107"></a>The output from the C preprocessor looks much like the input, except
|
||||
that all preprocessing directive lines have been replaced with blank
|
||||
lines and all comments with spaces. Long runs of blank lines are
|
||||
discarded.
|
||||
|
||||
<p>The ISO standard specifies that it is implementation defined whether a
|
||||
preprocessor preserves whitespace between tokens, or replaces it with
|
||||
e.g. a single space. In GNU CPP, whitespace between tokens is collapsed
|
||||
to become a single space, with the exception that the first token on a
|
||||
non-directive line is preceded with sufficient spaces that it appears in
|
||||
the same column in the preprocessed output that it appeared in the
|
||||
original source file. This is so the output is easy to read.
|
||||
See <a href="Differences-from-previous-versions.html#Differences-from-previous-versions">Differences from previous versions</a>. CPP does not insert any
|
||||
whitespace where there was none in the original source, except where
|
||||
necessary to prevent an accidental token paste.
|
||||
|
||||
<p><a name="index-linemarkers-108"></a>Source file name and line number information is conveyed by lines
|
||||
of the form
|
||||
|
||||
<pre class="smallexample"> # <var>linenum</var> <var>filename</var> <var>flags</var>
|
||||
</pre>
|
||||
<p class="noindent">These are called <dfn>linemarkers</dfn>. They are inserted as needed into
|
||||
the output (but never within a string or character constant). They mean
|
||||
that the following line originated in file <var>filename</var> at line
|
||||
<var>linenum</var>. <var>filename</var> will never contain any non-printing
|
||||
characters; they are replaced with octal escape sequences.
|
||||
|
||||
<p>After the file name comes zero or more flags, which are ‘<samp><span class="samp">1</span></samp>’,
|
||||
‘<samp><span class="samp">2</span></samp>’, ‘<samp><span class="samp">3</span></samp>’, or ‘<samp><span class="samp">4</span></samp>’. If there are multiple flags, spaces
|
||||
separate them. Here is what the flags mean:
|
||||
|
||||
<dl>
|
||||
<dt>‘<samp><span class="samp">1</span></samp>’<dd>This indicates the start of a new file.
|
||||
<br><dt>‘<samp><span class="samp">2</span></samp>’<dd>This indicates returning to a file (after having included another file).
|
||||
<br><dt>‘<samp><span class="samp">3</span></samp>’<dd>This indicates that the following text comes from a system header file,
|
||||
so certain warnings should be suppressed.
|
||||
<br><dt>‘<samp><span class="samp">4</span></samp>’<dd>This indicates that the following text should be treated as being
|
||||
wrapped in an implicit <code>extern "C"</code> block.
|
||||
<!-- maybe cross reference NO_IMPLICIT_EXTERN_C -->
|
||||
</dl>
|
||||
|
||||
<p>As an extension, the preprocessor accepts linemarkers in non-assembler
|
||||
input files. They are treated like the corresponding ‘<samp><span class="samp">#line</span></samp>’
|
||||
directive, (see <a href="Line-Control.html#Line-Control">Line Control</a>), except that trailing flags are
|
||||
permitted, and are interpreted with the meanings described above. If
|
||||
multiple flags are given, they must be in ascending order.
|
||||
|
||||
<p>Some directives may be duplicated in the output of the preprocessor.
|
||||
These are ‘<samp><span class="samp">#ident</span></samp>’ (always), ‘<samp><span class="samp">#pragma</span></samp>’ (only if the
|
||||
preprocessor does not handle the pragma itself), and ‘<samp><span class="samp">#define</span></samp>’ and
|
||||
‘<samp><span class="samp">#undef</span></samp>’ (with certain debugging options). If this happens, the
|
||||
‘<samp><span class="samp">#</span></samp>’ of the directive will always be in the first column, and there
|
||||
will be no space between the ‘<samp><span class="samp">#</span></samp>’ and the directive name. If macro
|
||||
expansion happens to generate tokens which might be mistaken for a
|
||||
duplicated directive, a space will be inserted between the ‘<samp><span class="samp">#</span></samp>’ and
|
||||
the directive name.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,130 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Search Path - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Header-Files.html#Header-Files" title="Header Files">
|
||||
<link rel="prev" href="Include-Operation.html#Include-Operation" title="Include Operation">
|
||||
<link rel="next" href="Once_002dOnly-Headers.html#Once_002dOnly-Headers" title="Once-Only Headers">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Search-Path"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Once_002dOnly-Headers.html#Once_002dOnly-Headers">Once-Only Headers</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Include-Operation.html#Include-Operation">Include Operation</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Header-Files.html#Header-Files">Header Files</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">2.3 Search Path</h3>
|
||||
|
||||
<p>GCC looks in several different places for headers. On a normal Unix
|
||||
system, if you do not instruct it otherwise, it will look for headers
|
||||
requested with <code>#include <</code><var>file</var><code>><!-- /@w --></code> in:
|
||||
|
||||
<pre class="smallexample"> /usr/local/include
|
||||
<var>libdir</var>/gcc/<var>target</var>/<var>version</var>/include
|
||||
/usr/<var>target</var>/include
|
||||
/usr/include
|
||||
</pre>
|
||||
<p>For C++ programs, it will also look in <samp><span class="file">/usr/include/g++-v3</span></samp>,
|
||||
first. In the above, <var>target</var> is the canonical name of the system
|
||||
GCC was configured to compile code for; often but not always the same as
|
||||
the canonical name of the system it runs on. <var>version</var> is the
|
||||
version of GCC in use.
|
||||
|
||||
<p>You can add to this list with the <samp><span class="option">-I</span><var>dir</var></samp> command line
|
||||
option. All the directories named by <samp><span class="option">-I</span></samp> are searched, in
|
||||
left-to-right order, <em>before</em> the default directories. The only
|
||||
exception is when <samp><span class="file">dir</span></samp> is already searched by default. In
|
||||
this case, the option is ignored and the search order for system
|
||||
directories remains unchanged.
|
||||
|
||||
<p>Duplicate directories are removed from the quote and bracket search
|
||||
chains before the two chains are merged to make the final search chain.
|
||||
Thus, it is possible for a directory to occur twice in the final search
|
||||
chain if it was specified in both the quote and bracket chains.
|
||||
|
||||
<p>You can prevent GCC from searching any of the default directories with
|
||||
the <samp><span class="option">-nostdinc</span></samp> option. This is useful when you are compiling an
|
||||
operating system kernel or some other program that does not use the
|
||||
standard C library facilities, or the standard C library itself.
|
||||
<samp><span class="option">-I</span></samp> options are not ignored as described above when
|
||||
<samp><span class="option">-nostdinc</span></samp> is in effect.
|
||||
|
||||
<p>GCC looks for headers requested with <code>#include "</code><var>file</var><code>"<!-- /@w --></code>
|
||||
first in the directory containing the current file, then in the
|
||||
directories as specified by <samp><span class="option">-iquote</span></samp> options, then in the same
|
||||
places it would have looked for a header requested with angle
|
||||
brackets. For example, if <samp><span class="file">/usr/include/sys/stat.h</span></samp> contains
|
||||
<code>#include "types.h"<!-- /@w --></code>, GCC looks for <samp><span class="file">types.h</span></samp> first in
|
||||
<samp><span class="file">/usr/include/sys</span></samp>, then in its usual search path.
|
||||
|
||||
<p>‘<samp><span class="samp">#line</span></samp>’ (see <a href="Line-Control.html#Line-Control">Line Control</a>) does not change GCC's idea of the
|
||||
directory containing the current file.
|
||||
|
||||
<p>You may put <samp><span class="option">-I-</span></samp> at any point in your list of <samp><span class="option">-I</span></samp> options.
|
||||
This has two effects. First, directories appearing before the
|
||||
<samp><span class="option">-I-</span></samp> in the list are searched only for headers requested with
|
||||
quote marks. Directories after <samp><span class="option">-I-</span></samp> are searched for all
|
||||
headers. Second, the directory containing the current file is not
|
||||
searched for anything, unless it happens to be one of the directories
|
||||
named by an <samp><span class="option">-I</span></samp> switch. <samp><span class="option">-I-</span></samp> is deprecated, <samp><span class="option">-iquote</span></samp>
|
||||
should be used instead.
|
||||
|
||||
<p><samp><span class="option">-I. -I-</span></samp> is not the same as no <samp><span class="option">-I</span></samp> options at all, and does
|
||||
not cause the same behavior for ‘<samp><span class="samp"><></span></samp>’ includes that ‘<samp><span class="samp">""</span></samp>’
|
||||
includes get with no special options. <samp><span class="option">-I.</span></samp> searches the
|
||||
compiler's current working directory for header files. That may or may
|
||||
not be the same as the directory containing the current file.
|
||||
|
||||
<p>If you need to look for headers in a directory named <samp><span class="file">-</span></samp>, write
|
||||
<samp><span class="option">-I./-</span></samp>.
|
||||
|
||||
<p>There are several more ways to adjust the header search path. They are
|
||||
generally less useful. See <a href="Invocation.html#Invocation">Invocation</a>.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,122 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Self-Referential Macros - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macro-Pitfalls.html#Macro-Pitfalls" title="Macro Pitfalls">
|
||||
<link rel="prev" href="Duplication-of-Side-Effects.html#Duplication-of-Side-Effects" title="Duplication of Side Effects">
|
||||
<link rel="next" href="Argument-Prescan.html#Argument-Prescan" title="Argument Prescan">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Self-Referential-Macros"></a>
|
||||
<a name="Self_002dReferential-Macros"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Argument-Prescan.html#Argument-Prescan">Argument Prescan</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Duplication-of-Side-Effects.html#Duplication-of-Side-Effects">Duplication of Side Effects</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macro-Pitfalls.html#Macro-Pitfalls">Macro Pitfalls</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h4 class="subsection">3.10.5 Self-Referential Macros</h4>
|
||||
|
||||
<p><a name="index-self_002dreference-78"></a>
|
||||
A <dfn>self-referential</dfn> macro is one whose name appears in its
|
||||
definition. Recall that all macro definitions are rescanned for more
|
||||
macros to replace. If the self-reference were considered a use of the
|
||||
macro, it would produce an infinitely large expansion. To prevent this,
|
||||
the self-reference is not considered a macro call. It is passed into
|
||||
the preprocessor output unchanged. Consider an example:
|
||||
|
||||
<pre class="smallexample"> #define foo (4 + foo)
|
||||
</pre>
|
||||
<p class="noindent">where <code>foo</code> is also a variable in your program.
|
||||
|
||||
<p>Following the ordinary rules, each reference to <code>foo</code> will expand
|
||||
into <code>(4 + foo)</code>; then this will be rescanned and will expand into
|
||||
<code>(4 + (4 + foo))</code>; and so on until the computer runs out of memory.
|
||||
|
||||
<p>The self-reference rule cuts this process short after one step, at
|
||||
<code>(4 + foo)</code>. Therefore, this macro definition has the possibly
|
||||
useful effect of causing the program to add 4 to the value of <code>foo</code>
|
||||
wherever <code>foo</code> is referred to.
|
||||
|
||||
<p>In most cases, it is a bad idea to take advantage of this feature. A
|
||||
person reading the program who sees that <code>foo</code> is a variable will
|
||||
not expect that it is a macro as well. The reader will come across the
|
||||
identifier <code>foo</code> in the program and think its value should be that
|
||||
of the variable <code>foo</code>, whereas in fact the value is four greater.
|
||||
|
||||
<p>One common, useful use of self-reference is to create a macro which
|
||||
expands to itself. If you write
|
||||
|
||||
<pre class="smallexample"> #define EPERM EPERM
|
||||
</pre>
|
||||
<p class="noindent">then the macro <code>EPERM</code> expands to <code>EPERM</code>. Effectively, it is
|
||||
left alone by the preprocessor whenever it's used in running text. You
|
||||
can tell that it's a macro with ‘<samp><span class="samp">#ifdef</span></samp>’. You might do this if you
|
||||
want to define numeric constants with an <code>enum</code>, but have
|
||||
‘<samp><span class="samp">#ifdef</span></samp>’ be true for each constant.
|
||||
|
||||
<p>If a macro <code>x</code> expands to use a macro <code>y</code>, and the expansion of
|
||||
<code>y</code> refers to the macro <code>x</code>, that is an <dfn>indirect
|
||||
self-reference</dfn> of <code>x</code>. <code>x</code> is not expanded in this case
|
||||
either. Thus, if we have
|
||||
|
||||
<pre class="smallexample"> #define x (4 + y)
|
||||
#define y (2 * x)
|
||||
</pre>
|
||||
<p class="noindent">then <code>x</code> and <code>y</code> expand as follows:
|
||||
|
||||
<pre class="smallexample"> x ==> (4 + y)
|
||||
==> (4 + (2 * x))
|
||||
|
||||
y ==> (2 * x)
|
||||
==> (2 * (4 + y))
|
||||
</pre>
|
||||
<p class="noindent">Each macro is expanded when it appears in the definition of the other
|
||||
macro, but not when it indirectly appears in its own definition.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,181 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Standard Predefined Macros - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Predefined-Macros.html#Predefined-Macros" title="Predefined Macros">
|
||||
<link rel="next" href="Common-Predefined-Macros.html#Common-Predefined-Macros" title="Common Predefined Macros">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Standard-Predefined-Macros"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Common-Predefined-Macros.html#Common-Predefined-Macros">Common Predefined Macros</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Predefined-Macros.html#Predefined-Macros">Predefined Macros</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h4 class="subsection">3.7.1 Standard Predefined Macros</h4>
|
||||
|
||||
<p><a name="index-standard-predefined-macros_002e-60"></a>
|
||||
The standard predefined macros are specified by the relevant
|
||||
language standards, so they are available with all compilers that
|
||||
implement those standards. Older compilers may not provide all of
|
||||
them. Their names all start with double underscores.
|
||||
|
||||
<dl>
|
||||
<dt><code>__FILE__</code><dd>This macro expands to the name of the current input file, in the form of
|
||||
a C string constant. This is the path by which the preprocessor opened
|
||||
the file, not the short name specified in ‘<samp><span class="samp">#include</span></samp>’ or as the
|
||||
input file name argument. For example,
|
||||
<code>"/usr/local/include/myheader.h"</code> is a possible expansion of this
|
||||
macro.
|
||||
|
||||
<br><dt><code>__LINE__</code><dd>This macro expands to the current input line number, in the form of a
|
||||
decimal integer constant. While we call it a predefined macro, it's
|
||||
a pretty strange macro, since its “definition” changes with each
|
||||
new line of source code.
|
||||
</dl>
|
||||
|
||||
<p><code>__FILE__</code> and <code>__LINE__</code> are useful in generating an error
|
||||
message to report an inconsistency detected by the program; the message
|
||||
can state the source line at which the inconsistency was detected. For
|
||||
example,
|
||||
|
||||
<pre class="smallexample"> fprintf (stderr, "Internal error: "
|
||||
"negative string length "
|
||||
"%d at %s, line %d.",
|
||||
length, __FILE__, __LINE__);
|
||||
</pre>
|
||||
<p>An ‘<samp><span class="samp">#include</span></samp>’ directive changes the expansions of <code>__FILE__</code>
|
||||
and <code>__LINE__</code> to correspond to the included file. At the end of
|
||||
that file, when processing resumes on the input file that contained
|
||||
the ‘<samp><span class="samp">#include</span></samp>’ directive, the expansions of <code>__FILE__</code> and
|
||||
<code>__LINE__</code> revert to the values they had before the
|
||||
‘<samp><span class="samp">#include</span></samp>’ (but <code>__LINE__</code> is then incremented by one as
|
||||
processing moves to the line after the ‘<samp><span class="samp">#include</span></samp>’).
|
||||
|
||||
<p>A ‘<samp><span class="samp">#line</span></samp>’ directive changes <code>__LINE__</code>, and may change
|
||||
<code>__FILE__</code> as well. See <a href="Line-Control.html#Line-Control">Line Control</a>.
|
||||
|
||||
<p>C99 introduces <code>__func__</code>, and GCC has provided <code>__FUNCTION__</code>
|
||||
for a long time. Both of these are strings containing the name of the
|
||||
current function (there are slight semantic differences; see the GCC
|
||||
manual). Neither of them is a macro; the preprocessor does not know the
|
||||
name of the current function. They tend to be useful in conjunction
|
||||
with <code>__FILE__</code> and <code>__LINE__</code>, though.
|
||||
|
||||
<dl>
|
||||
<dt><code>__DATE__</code><dd>This macro expands to a string constant that describes the date on which
|
||||
the preprocessor is being run. The string constant contains eleven
|
||||
characters and looks like <code>"Feb 12 1996"<!-- /@w --></code>. If the day of the
|
||||
month is less than 10, it is padded with a space on the left.
|
||||
|
||||
<p>If GCC cannot determine the current date, it will emit a warning message
|
||||
(once per compilation) and <code>__DATE__</code> will expand to
|
||||
<code>"??? ?? ????"<!-- /@w --></code>.
|
||||
|
||||
<br><dt><code>__TIME__</code><dd>This macro expands to a string constant that describes the time at
|
||||
which the preprocessor is being run. The string constant contains
|
||||
eight characters and looks like <code>"23:59:01"</code>.
|
||||
|
||||
<p>If GCC cannot determine the current time, it will emit a warning message
|
||||
(once per compilation) and <code>__TIME__</code> will expand to
|
||||
<code>"??:??:??"</code>.
|
||||
|
||||
<br><dt><code>__STDC__</code><dd>In normal operation, this macro expands to the constant 1, to signify
|
||||
that this compiler conforms to ISO Standard C. If GNU CPP is used with
|
||||
a compiler other than GCC, this is not necessarily true; however, the
|
||||
preprocessor always conforms to the standard unless the
|
||||
<samp><span class="option">-traditional-cpp</span></samp> option is used.
|
||||
|
||||
<p>This macro is not defined if the <samp><span class="option">-traditional-cpp</span></samp> option is used.
|
||||
|
||||
<p>On some hosts, the system compiler uses a different convention, where
|
||||
<code>__STDC__</code> is normally 0, but is 1 if the user specifies strict
|
||||
conformance to the C Standard. CPP follows the host convention when
|
||||
processing system header files, but when processing user files
|
||||
<code>__STDC__</code> is always 1. This has been reported to cause problems;
|
||||
for instance, some versions of Solaris provide X Windows headers that
|
||||
expect <code>__STDC__</code> to be either undefined or 1. See <a href="Invocation.html#Invocation">Invocation</a>.
|
||||
|
||||
<br><dt><code>__STDC_VERSION__</code><dd>This macro expands to the C Standard's version number, a long integer
|
||||
constant of the form <var>yyyy</var><var>mm</var><code>L</code> where <var>yyyy</var> and
|
||||
<var>mm</var> are the year and month of the Standard version. This signifies
|
||||
which version of the C Standard the compiler conforms to. Like
|
||||
<code>__STDC__</code>, this is not necessarily accurate for the entire
|
||||
implementation, unless GNU CPP is being used with GCC.
|
||||
|
||||
<p>The value <code>199409L</code> signifies the 1989 C standard as amended in
|
||||
1994, which is the current default; the value <code>199901L</code> signifies
|
||||
the 1999 revision of the C standard. Support for the 1999 revision is
|
||||
not yet complete.
|
||||
|
||||
<p>This macro is not defined if the <samp><span class="option">-traditional-cpp</span></samp> option is
|
||||
used, nor when compiling C++ or Objective-C.
|
||||
|
||||
<br><dt><code>__STDC_HOSTED__</code><dd>This macro is defined, with value 1, if the compiler's target is a
|
||||
<dfn>hosted environment</dfn>. A hosted environment has the complete
|
||||
facilities of the standard C library available.
|
||||
|
||||
<br><dt><code>__cplusplus</code><dd>This macro is defined when the C++ compiler is in use. You can use
|
||||
<code>__cplusplus</code> to test whether a header is compiled by a C compiler
|
||||
or a C++ compiler. This macro is similar to <code>__STDC_VERSION__</code>, in
|
||||
that it expands to a version number. A fully conforming implementation
|
||||
of the 1998 C++ standard will define this macro to <code>199711L</code>. The
|
||||
GNU C++ compiler is not yet fully conforming, so it uses <code>1</code>
|
||||
instead. It is hoped to complete the implementation of standard C++
|
||||
in the near future.
|
||||
|
||||
<br><dt><code>__OBJC__</code><dd>This macro is defined, with value 1, when the Objective-C compiler is in
|
||||
use. You can use <code>__OBJC__</code> to test whether a header is compiled
|
||||
by a C compiler or an Objective-C compiler.
|
||||
|
||||
<br><dt><code>__ASSEMBLER__</code><dd>This macro is defined with value 1 when preprocessing assembly
|
||||
language.
|
||||
|
||||
</dl>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,136 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Stringification - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macros.html#Macros" title="Macros">
|
||||
<link rel="prev" href="Macro-Arguments.html#Macro-Arguments" title="Macro Arguments">
|
||||
<link rel="next" href="Concatenation.html#Concatenation" title="Concatenation">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Stringification"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Concatenation.html#Concatenation">Concatenation</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Macro-Arguments.html#Macro-Arguments">Macro Arguments</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macros.html#Macros">Macros</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">3.4 Stringification</h3>
|
||||
|
||||
<p><a name="index-stringification-50"></a><a name="index-g_t_0040samp_007b_0023_007d-operator-51"></a>
|
||||
Sometimes you may want to convert a macro argument into a string
|
||||
constant. Parameters are not replaced inside string constants, but you
|
||||
can use the ‘<samp><span class="samp">#</span></samp>’ preprocessing operator instead. When a macro
|
||||
parameter is used with a leading ‘<samp><span class="samp">#</span></samp>’, the preprocessor replaces it
|
||||
with the literal text of the actual argument, converted to a string
|
||||
constant. Unlike normal parameter replacement, the argument is not
|
||||
macro-expanded first. This is called <dfn>stringification</dfn>.
|
||||
|
||||
<p>There is no way to combine an argument with surrounding text and
|
||||
stringify it all together. Instead, you can write a series of adjacent
|
||||
string constants and stringified arguments. The preprocessor will
|
||||
replace the stringified arguments with string constants. The C
|
||||
compiler will then combine all the adjacent string constants into one
|
||||
long string.
|
||||
|
||||
<p>Here is an example of a macro definition that uses stringification:
|
||||
|
||||
<pre class="smallexample"> #define WARN_IF(EXP) \
|
||||
do { if (EXP) \
|
||||
fprintf (stderr, "Warning: " #EXP "\n"); } \
|
||||
while (0)
|
||||
WARN_IF (x == 0);
|
||||
==> do { if (x == 0)
|
||||
fprintf (stderr, "Warning: " "x == 0" "\n"); } while (0);
|
||||
</pre>
|
||||
<p class="noindent">The argument for <code>EXP</code> is substituted once, as-is, into the
|
||||
<code>if</code> statement, and once, stringified, into the argument to
|
||||
<code>fprintf</code>. If <code>x</code> were a macro, it would be expanded in the
|
||||
<code>if</code> statement, but not in the string.
|
||||
|
||||
<p>The <code>do</code> and <code>while (0)</code> are a kludge to make it possible to
|
||||
write <code>WARN_IF (</code><var>arg</var><code>);</code>, which the resemblance of
|
||||
<code>WARN_IF</code> to a function would make C programmers want to do; see
|
||||
<a href="Swallowing-the-Semicolon.html#Swallowing-the-Semicolon">Swallowing the Semicolon</a>.
|
||||
|
||||
<p>Stringification in C involves more than putting double-quote characters
|
||||
around the fragment. The preprocessor backslash-escapes the quotes
|
||||
surrounding embedded string constants, and all backslashes within string and
|
||||
character constants, in order to get a valid C string constant with the
|
||||
proper contents. Thus, stringifying <code>p = "foo\n";<!-- /@w --></code> results in
|
||||
<tt>"p = \"foo\\n\";"<!-- /@w --></tt>. However, backslashes that are not inside string
|
||||
or character constants are not duplicated: ‘<samp><span class="samp">\n</span></samp>’ by itself
|
||||
stringifies to <tt>"\n"</tt>.
|
||||
|
||||
<p>All leading and trailing whitespace in text being stringified is
|
||||
ignored. Any sequence of whitespace in the middle of the text is
|
||||
converted to a single space in the stringified result. Comments are
|
||||
replaced by whitespace long before stringification happens, so they
|
||||
never appear in stringified text.
|
||||
|
||||
<p>There is no way to convert a macro argument into a character constant.
|
||||
|
||||
<p>If you want to stringify the result of expansion of a macro argument,
|
||||
you have to use two levels of macros.
|
||||
|
||||
<pre class="smallexample"> #define xstr(s) str(s)
|
||||
#define str(s) #s
|
||||
#define foo 4
|
||||
str (foo)
|
||||
==> "foo"
|
||||
xstr (foo)
|
||||
==> xstr (4)
|
||||
==> str (4)
|
||||
==> "4"
|
||||
</pre>
|
||||
<p><code>s</code> is stringified when it is used in <code>str</code>, so it is not
|
||||
macro-expanded first. But <code>s</code> is an ordinary argument to
|
||||
<code>xstr</code>, so it is completely macro-expanded before <code>xstr</code>
|
||||
itself is expanded (see <a href="Argument-Prescan.html#Argument-Prescan">Argument Prescan</a>). Therefore, by the time
|
||||
<code>str</code> gets to its argument, it has already been macro-expanded.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,115 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Swallowing the Semicolon - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macro-Pitfalls.html#Macro-Pitfalls" title="Macro Pitfalls">
|
||||
<link rel="prev" href="Operator-Precedence-Problems.html#Operator-Precedence-Problems" title="Operator Precedence Problems">
|
||||
<link rel="next" href="Duplication-of-Side-Effects.html#Duplication-of-Side-Effects" title="Duplication of Side Effects">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Swallowing-the-Semicolon"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Duplication-of-Side-Effects.html#Duplication-of-Side-Effects">Duplication of Side Effects</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Operator-Precedence-Problems.html#Operator-Precedence-Problems">Operator Precedence Problems</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macro-Pitfalls.html#Macro-Pitfalls">Macro Pitfalls</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h4 class="subsection">3.10.3 Swallowing the Semicolon</h4>
|
||||
|
||||
<p><a name="index-semicolons-_0028after-macro-calls_0029-75"></a>
|
||||
Often it is desirable to define a macro that expands into a compound
|
||||
statement. Consider, for example, the following macro, that advances a
|
||||
pointer (the argument <code>p</code> says where to find it) across whitespace
|
||||
characters:
|
||||
|
||||
<pre class="smallexample"> #define SKIP_SPACES(p, limit) \
|
||||
{ char *lim = (limit); \
|
||||
while (p < lim) { \
|
||||
if (*p++ != ' ') { \
|
||||
p--; break; }}}
|
||||
</pre>
|
||||
<p class="noindent">Here backslash-newline is used to split the macro definition, which must
|
||||
be a single logical line, so that it resembles the way such code would
|
||||
be laid out if not part of a macro definition.
|
||||
|
||||
<p>A call to this macro might be <code>SKIP_SPACES (p, lim)</code>. Strictly
|
||||
speaking, the call expands to a compound statement, which is a complete
|
||||
statement with no need for a semicolon to end it. However, since it
|
||||
looks like a function call, it minimizes confusion if you can use it
|
||||
like a function call, writing a semicolon afterward, as in
|
||||
<code>SKIP_SPACES (p, lim);</code>
|
||||
|
||||
<p>This can cause trouble before <code>else</code> statements, because the
|
||||
semicolon is actually a null statement. Suppose you write
|
||||
|
||||
<pre class="smallexample"> if (*p != 0)
|
||||
SKIP_SPACES (p, lim);
|
||||
else ...
|
||||
</pre>
|
||||
<p class="noindent">The presence of two statements—the compound statement and a null
|
||||
statement—in between the <code>if</code> condition and the <code>else</code>
|
||||
makes invalid C code.
|
||||
|
||||
<p>The definition of the macro <code>SKIP_SPACES</code> can be altered to solve
|
||||
this problem, using a <code>do ... while</code> statement. Here is how:
|
||||
|
||||
<pre class="smallexample"> #define SKIP_SPACES(p, limit) \
|
||||
do { char *lim = (limit); \
|
||||
while (p < lim) { \
|
||||
if (*p++ != ' ') { \
|
||||
p--; break; }}} \
|
||||
while (0)
|
||||
</pre>
|
||||
<p>Now <code>SKIP_SPACES (p, lim);</code> expands into
|
||||
|
||||
<pre class="smallexample"> do {...} while (0);
|
||||
</pre>
|
||||
<p class="noindent">which is one statement. The loop executes exactly once; most compilers
|
||||
generate no extra code for it.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,98 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>System Headers - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Header-Files.html#Header-Files" title="Header Files">
|
||||
<link rel="prev" href="Wrapper-Headers.html#Wrapper-Headers" title="Wrapper Headers">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="System-Headers"></a>
|
||||
<p>
|
||||
Previous: <a rel="previous" accesskey="p" href="Wrapper-Headers.html#Wrapper-Headers">Wrapper Headers</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Header-Files.html#Header-Files">Header Files</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">2.8 System Headers</h3>
|
||||
|
||||
<p><a name="index-system-header-files-39"></a>
|
||||
The header files declaring interfaces to the operating system and
|
||||
runtime libraries often cannot be written in strictly conforming C.
|
||||
Therefore, GCC gives code found in <dfn>system headers</dfn> special
|
||||
treatment. All warnings, other than those generated by ‘<samp><span class="samp">#warning</span></samp>’
|
||||
(see <a href="Diagnostics.html#Diagnostics">Diagnostics</a>), are suppressed while GCC is processing a system
|
||||
header. Macros defined in a system header are immune to a few warnings
|
||||
wherever they are expanded. This immunity is granted on an ad-hoc
|
||||
basis, when we find that a warning generates lots of false positives
|
||||
because of code in macros defined in system headers.
|
||||
|
||||
<p>Normally, only the headers found in specific directories are considered
|
||||
system headers. These directories are determined when GCC is compiled.
|
||||
There are, however, two ways to make normal headers into system headers.
|
||||
|
||||
<p>The <samp><span class="option">-isystem</span></samp> command line option adds its argument to the list of
|
||||
directories to search for headers, just like <samp><span class="option">-I</span></samp>. Any headers
|
||||
found in that directory will be considered system headers.
|
||||
|
||||
<p>All directories named by <samp><span class="option">-isystem</span></samp> are searched <em>after</em> all
|
||||
directories named by <samp><span class="option">-I</span></samp>, no matter what their order was on the
|
||||
command line. If the same directory is named by both <samp><span class="option">-I</span></samp> and
|
||||
<samp><span class="option">-isystem</span></samp>, the <samp><span class="option">-I</span></samp> option is ignored. GCC provides an
|
||||
informative message when this occurs if <samp><span class="option">-v</span></samp> is used.
|
||||
|
||||
<p><a name="index-g_t_0023pragma-GCC-system_005fheader-40"></a>There is also a directive, <code>#pragma GCC system_header<!-- /@w --></code>, which
|
||||
tells GCC to consider the rest of the current include file a system
|
||||
header, no matter where it was found. Code that comes before the
|
||||
‘<samp><span class="samp">#pragma</span></samp>’ in the file will not be affected. <code>#pragma GCC system_header<!-- /@w --></code> has no effect in the primary source file.
|
||||
|
||||
<p>On very old systems, some of the pre-defined system header directories
|
||||
get even more special treatment. GNU C++ considers code in headers
|
||||
found in those directories to be surrounded by an <code>extern "C"<!-- /@w --></code>
|
||||
block. There is no way to request this behavior with a ‘<samp><span class="samp">#pragma</span></samp>’,
|
||||
or from the command line.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,99 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>System-specific Predefined Macros - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Predefined-Macros.html#Predefined-Macros" title="Predefined Macros">
|
||||
<link rel="prev" href="Common-Predefined-Macros.html#Common-Predefined-Macros" title="Common Predefined Macros">
|
||||
<link rel="next" href="C_002b_002b-Named-Operators.html#C_002b_002b-Named-Operators" title="C++ Named Operators">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="System-specific-Predefined-Macros"></a>
|
||||
<a name="System_002dspecific-Predefined-Macros"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="C_002b_002b-Named-Operators.html#C_002b_002b-Named-Operators">C++ Named Operators</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Common-Predefined-Macros.html#Common-Predefined-Macros">Common Predefined Macros</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Predefined-Macros.html#Predefined-Macros">Predefined Macros</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h4 class="subsection">3.7.3 System-specific Predefined Macros</h4>
|
||||
|
||||
<p><a name="index-system_002dspecific-predefined-macros-62"></a><a name="index-predefined-macros_002c-system_002dspecific-63"></a><a name="index-reserved-namespace-64"></a>
|
||||
The C preprocessor normally predefines several macros that indicate what
|
||||
type of system and machine is in use. They are obviously different on
|
||||
each target supported by GCC. This manual, being for all systems and
|
||||
machines, cannot tell you what their names are, but you can use
|
||||
<samp><span class="command">cpp -dM</span></samp> to see them all. See <a href="Invocation.html#Invocation">Invocation</a>. All system-specific
|
||||
predefined macros expand to the constant 1, so you can test them with
|
||||
either ‘<samp><span class="samp">#ifdef</span></samp>’ or ‘<samp><span class="samp">#if</span></samp>’.
|
||||
|
||||
<p>The C standard requires that all system-specific macros be part of the
|
||||
<dfn>reserved namespace</dfn>. All names which begin with two underscores,
|
||||
or an underscore and a capital letter, are reserved for the compiler and
|
||||
library to use as they wish. However, historically system-specific
|
||||
macros have had names with no special prefix; for instance, it is common
|
||||
to find <code>unix</code> defined on Unix systems. For all such macros, GCC
|
||||
provides a parallel macro with two underscores added at the beginning
|
||||
and the end. If <code>unix</code> is defined, <code>__unix__</code> will be defined
|
||||
too. There will never be more than two underscores; the parallel of
|
||||
<code>_mips</code> is <code>__mips__</code>.
|
||||
|
||||
<p>When the <samp><span class="option">-ansi</span></samp> option, or any <samp><span class="option">-std</span></samp> option that
|
||||
requests strict conformance, is given to the compiler, all the
|
||||
system-specific predefined macros outside the reserved namespace are
|
||||
suppressed. The parallel macros, inside the reserved namespace, remain
|
||||
defined.
|
||||
|
||||
<p>We are slowly phasing out all predefined macros which are outside the
|
||||
reserved namespace. You should never use them in new programs, and we
|
||||
encourage you to correct older code to use the parallel macros whenever
|
||||
you find it. We don't recommend you use the system-specific macros that
|
||||
are in the reserved namespace, either. It is better in the long run to
|
||||
check specifically for features you need, using a tool such as
|
||||
<samp><span class="command">autoconf</span></samp>.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,123 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>The preprocessing language - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Overview.html#Overview" title="Overview">
|
||||
<link rel="prev" href="Tokenization.html#Tokenization" title="Tokenization">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="The-preprocessing-language"></a>
|
||||
<p>
|
||||
Previous: <a rel="previous" accesskey="p" href="Tokenization.html#Tokenization">Tokenization</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Overview.html#Overview">Overview</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">1.4 The preprocessing language</h3>
|
||||
|
||||
<p><a name="index-directives-21"></a><a name="index-preprocessing-directives-22"></a><a name="index-directive-line-23"></a><a name="index-directive-name-24"></a>
|
||||
After tokenization, the stream of tokens may simply be passed straight
|
||||
to the compiler's parser. However, if it contains any operations in the
|
||||
<dfn>preprocessing language</dfn>, it will be transformed first. This stage
|
||||
corresponds roughly to the standard's “translation phase 4” and is
|
||||
what most people think of as the preprocessor's job.
|
||||
|
||||
<p>The preprocessing language consists of <dfn>directives</dfn> to be executed
|
||||
and <dfn>macros</dfn> to be expanded. Its primary capabilities are:
|
||||
|
||||
<ul>
|
||||
<li>Inclusion of header files. These are files of declarations that can be
|
||||
substituted into your program.
|
||||
|
||||
<li>Macro expansion. You can define <dfn>macros</dfn>, which are abbreviations
|
||||
for arbitrary fragments of C code. The preprocessor will replace the
|
||||
macros with their definitions throughout the program. Some macros are
|
||||
automatically defined for you.
|
||||
|
||||
<li>Conditional compilation. You can include or exclude parts of the
|
||||
program according to various conditions.
|
||||
|
||||
<li>Line control. If you use a program to combine or rearrange source files
|
||||
into an intermediate file which is then compiled, you can use line
|
||||
control to inform the compiler where each source line originally came
|
||||
from.
|
||||
|
||||
<li>Diagnostics. You can detect problems at compile time and issue errors
|
||||
or warnings.
|
||||
</ul>
|
||||
|
||||
<p>There are a few more, less useful, features.
|
||||
|
||||
<p>Except for expansion of predefined macros, all these operations are
|
||||
triggered with <dfn>preprocessing directives</dfn>. Preprocessing directives
|
||||
are lines in your program that start with ‘<samp><span class="samp">#</span></samp>’. Whitespace is
|
||||
allowed before and after the ‘<samp><span class="samp">#</span></samp>’. The ‘<samp><span class="samp">#</span></samp>’ is followed by an
|
||||
identifier, the <dfn>directive name</dfn>. It specifies the operation to
|
||||
perform. Directives are commonly referred to as ‘<samp><span class="samp">#</span><var>name</var></samp>’
|
||||
where <var>name</var> is the directive name. For example, ‘<samp><span class="samp">#define</span></samp>’ is
|
||||
the directive that defines a macro.
|
||||
|
||||
<p>The ‘<samp><span class="samp">#</span></samp>’ which begins a directive cannot come from a macro
|
||||
expansion. Also, the directive name is not macro expanded. Thus, if
|
||||
<code>foo</code> is defined as a macro expanding to <code>define</code>, that does
|
||||
not make ‘<samp><span class="samp">#foo</span></samp>’ a valid preprocessing directive.
|
||||
|
||||
<p>The set of valid directive names is fixed. Programs cannot define new
|
||||
preprocessing directives.
|
||||
|
||||
<p>Some directives require arguments; these make up the rest of the
|
||||
directive line and must be separated from the directive name by
|
||||
whitespace. For example, ‘<samp><span class="samp">#define</span></samp>’ must be followed by a macro
|
||||
name and the intended expansion of the macro.
|
||||
|
||||
<p>A preprocessing directive cannot cover more than one line. The line
|
||||
may, however, be continued with backslash-newline, or by a block comment
|
||||
which extends past the end of the line. In either case, when the
|
||||
directive is processed, the continuations have already been merged with
|
||||
the first line to make one long line.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,210 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Tokenization - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Overview.html#Overview" title="Overview">
|
||||
<link rel="prev" href="Initial-processing.html#Initial-processing" title="Initial processing">
|
||||
<link rel="next" href="The-preprocessing-language.html#The-preprocessing-language" title="The preprocessing language">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Tokenization"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="The-preprocessing-language.html#The-preprocessing-language">The preprocessing language</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Initial-processing.html#Initial-processing">Initial processing</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Overview.html#Overview">Overview</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">1.3 Tokenization</h3>
|
||||
|
||||
<p><a name="index-tokens-8"></a><a name="index-preprocessing-tokens-9"></a>After the textual transformations are finished, the input file is
|
||||
converted into a sequence of <dfn>preprocessing tokens</dfn>. These mostly
|
||||
correspond to the syntactic tokens used by the C compiler, but there are
|
||||
a few differences. White space separates tokens; it is not itself a
|
||||
token of any kind. Tokens do not have to be separated by white space,
|
||||
but it is often necessary to avoid ambiguities.
|
||||
|
||||
<p>When faced with a sequence of characters that has more than one possible
|
||||
tokenization, the preprocessor is greedy. It always makes each token,
|
||||
starting from the left, as big as possible before moving on to the next
|
||||
token. For instance, <code>a+++++b</code> is interpreted as
|
||||
<code>a ++ ++ + b<!-- /@w --></code>, not as <code>a ++ + ++ b<!-- /@w --></code>, even though the
|
||||
latter tokenization could be part of a valid C program and the former
|
||||
could not.
|
||||
|
||||
<p>Once the input file is broken into tokens, the token boundaries never
|
||||
change, except when the ‘<samp><span class="samp">##</span></samp>’ preprocessing operator is used to paste
|
||||
tokens together. See <a href="Concatenation.html#Concatenation">Concatenation</a>. For example,
|
||||
|
||||
<pre class="smallexample"> #define foo() bar
|
||||
foo()baz
|
||||
==> bar baz
|
||||
<em>not</em>
|
||||
==> barbaz
|
||||
</pre>
|
||||
<p>The compiler does not re-tokenize the preprocessor's output. Each
|
||||
preprocessing token becomes one compiler token.
|
||||
|
||||
<p><a name="index-identifiers-10"></a>Preprocessing tokens fall into five broad classes: identifiers,
|
||||
preprocessing numbers, string literals, punctuators, and other. An
|
||||
<dfn>identifier</dfn> is the same as an identifier in C: any sequence of
|
||||
letters, digits, or underscores, which begins with a letter or
|
||||
underscore. Keywords of C have no significance to the preprocessor;
|
||||
they are ordinary identifiers. You can define a macro whose name is a
|
||||
keyword, for instance. The only identifier which can be considered a
|
||||
preprocessing keyword is <code>defined</code>. See <a href="Defined.html#Defined">Defined</a>.
|
||||
|
||||
<p>This is mostly true of other languages which use the C preprocessor.
|
||||
However, a few of the keywords of C++ are significant even in the
|
||||
preprocessor. See <a href="C_002b_002b-Named-Operators.html#C_002b_002b-Named-Operators">C++ Named Operators</a>.
|
||||
|
||||
<p>In the 1999 C standard, identifiers may contain letters which are not
|
||||
part of the “basic source character set”, at the implementation's
|
||||
discretion (such as accented Latin letters, Greek letters, or Chinese
|
||||
ideograms). This may be done with an extended character set, or the
|
||||
‘<samp><span class="samp">\u</span></samp>’ and ‘<samp><span class="samp">\U</span></samp>’ escape sequences. The implementation of this
|
||||
feature in GCC is experimental; such characters are only accepted in
|
||||
the ‘<samp><span class="samp">\u</span></samp>’ and ‘<samp><span class="samp">\U</span></samp>’ forms and only if
|
||||
<samp><span class="option">-fextended-identifiers</span></samp> is used.
|
||||
|
||||
<p>As an extension, GCC treats ‘<samp><span class="samp">$</span></samp>’ as a letter. This is for
|
||||
compatibility with some systems, such as VMS, where ‘<samp><span class="samp">$</span></samp>’ is commonly
|
||||
used in system-defined function and object names. ‘<samp><span class="samp">$</span></samp>’ is not a
|
||||
letter in strictly conforming mode, or if you specify the <samp><span class="option">-$</span></samp>
|
||||
option. See <a href="Invocation.html#Invocation">Invocation</a>.
|
||||
|
||||
<p><a name="index-numbers-11"></a><a name="index-preprocessing-numbers-12"></a>A <dfn>preprocessing number</dfn> has a rather bizarre definition. The
|
||||
category includes all the normal integer and floating point constants
|
||||
one expects of C, but also a number of other things one might not
|
||||
initially recognize as a number. Formally, preprocessing numbers begin
|
||||
with an optional period, a required decimal digit, and then continue
|
||||
with any sequence of letters, digits, underscores, periods, and
|
||||
exponents. Exponents are the two-character sequences ‘<samp><span class="samp">e+</span></samp>’,
|
||||
‘<samp><span class="samp">e-</span></samp>’, ‘<samp><span class="samp">E+</span></samp>’, ‘<samp><span class="samp">E-</span></samp>’, ‘<samp><span class="samp">p+</span></samp>’, ‘<samp><span class="samp">p-</span></samp>’, ‘<samp><span class="samp">P+</span></samp>’, and
|
||||
‘<samp><span class="samp">P-</span></samp>’. (The exponents that begin with ‘<samp><span class="samp">p</span></samp>’ or ‘<samp><span class="samp">P</span></samp>’ are new
|
||||
to C99. They are used for hexadecimal floating-point constants.)
|
||||
|
||||
<p>The purpose of this unusual definition is to isolate the preprocessor
|
||||
from the full complexity of numeric constants. It does not have to
|
||||
distinguish between lexically valid and invalid floating-point numbers,
|
||||
which is complicated. The definition also permits you to split an
|
||||
identifier at any position and get exactly two tokens, which can then be
|
||||
pasted back together with the ‘<samp><span class="samp">##</span></samp>’ operator.
|
||||
|
||||
<p>It's possible for preprocessing numbers to cause programs to be
|
||||
misinterpreted. For example, <code>0xE+12</code> is a preprocessing number
|
||||
which does not translate to any valid numeric constant, therefore a
|
||||
syntax error. It does not mean <code>0xE + 12<!-- /@w --></code>, which is what you
|
||||
might have intended.
|
||||
|
||||
<p><a name="index-string-literals-13"></a><a name="index-string-constants-14"></a><a name="index-character-constants-15"></a><a name="index-header-file-names-16"></a><!-- the @: prevents makeinfo from turning '' into ". -->
|
||||
<dfn>String literals</dfn> are string constants, character constants, and
|
||||
header file names (the argument of ‘<samp><span class="samp">#include</span></samp>’).<a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a> String constants and character
|
||||
constants are straightforward: <tt>"<small class="dots">...</small>"</tt> or <tt>'<small class="dots">...</small>'</tt>. In
|
||||
either case embedded quotes should be escaped with a backslash:
|
||||
<tt>'\''</tt> is the character constant for ‘<samp><span class="samp">'</span></samp>’. There is no limit on
|
||||
the length of a character constant, but the value of a character
|
||||
constant that contains more than one character is
|
||||
implementation-defined. See <a href="Implementation-Details.html#Implementation-Details">Implementation Details</a>.
|
||||
|
||||
<p>Header file names either look like string constants, <tt>"<small class="dots">...</small>"</tt>, or are
|
||||
written with angle brackets instead, <tt><<small class="dots">...</small>></tt>. In either case,
|
||||
backslash is an ordinary character. There is no way to escape the
|
||||
closing quote or angle bracket. The preprocessor looks for the header
|
||||
file in different places depending on which form you use. See <a href="Include-Operation.html#Include-Operation">Include Operation</a>.
|
||||
|
||||
<p>No string literal may extend past the end of a line. Older versions
|
||||
of GCC accepted multi-line string constants. You may use continued
|
||||
lines instead, or string constant concatenation. See <a href="Differences-from-previous-versions.html#Differences-from-previous-versions">Differences from previous versions</a>.
|
||||
|
||||
<p><a name="index-punctuators-17"></a><a name="index-digraphs-18"></a><a name="index-alternative-tokens-19"></a><dfn>Punctuators</dfn> are all the usual bits of punctuation which are
|
||||
meaningful to C and C++. All but three of the punctuation characters in
|
||||
ASCII are C punctuators. The exceptions are ‘<samp><span class="samp">@</span></samp>’, ‘<samp><span class="samp">$</span></samp>’, and
|
||||
‘<samp><span class="samp">`</span></samp>’. In addition, all the two- and three-character operators are
|
||||
punctuators. There are also six <dfn>digraphs</dfn>, which the C++ standard
|
||||
calls <dfn>alternative tokens</dfn>, which are merely alternate ways to spell
|
||||
other punctuators. This is a second attempt to work around missing
|
||||
punctuation in obsolete systems. It has no negative side effects,
|
||||
unlike trigraphs, but does not cover as much ground. The digraphs and
|
||||
their corresponding normal punctuators are:
|
||||
|
||||
<pre class="smallexample"> Digraph: <% %> <: :> %: %:%:
|
||||
Punctuator: { } [ ] # ##
|
||||
</pre>
|
||||
<p><a name="index-other-tokens-20"></a>Any other single character is considered “other”. It is passed on to
|
||||
the preprocessor's output unmolested. The C compiler will almost
|
||||
certainly reject source code containing “other” tokens. In ASCII, the
|
||||
only other characters are ‘<samp><span class="samp">@</span></samp>’, ‘<samp><span class="samp">$</span></samp>’, ‘<samp><span class="samp">`</span></samp>’, and control
|
||||
characters other than NUL (all bits zero). (Note that ‘<samp><span class="samp">$</span></samp>’ is
|
||||
normally considered a letter.) All characters with the high bit set
|
||||
(numeric range 0x7F–0xFF) are also “other” in the present
|
||||
implementation. This will change when proper support for international
|
||||
character sets is added to GCC.
|
||||
|
||||
<p>NUL is a special case because of the high probability that its
|
||||
appearance is accidental, and because it may be invisible to the user
|
||||
(many terminals do not display NUL at all). Within comments, NULs are
|
||||
silently ignored, just as any other character would be. In running
|
||||
text, NUL is considered white space. For example, these two directives
|
||||
have the same meaning.
|
||||
|
||||
<pre class="smallexample"> #define X^@1
|
||||
#define X 1
|
||||
</pre>
|
||||
<p class="noindent">(where ‘<samp><span class="samp">^@</span></samp>’ is ASCII NUL). Within string or character constants,
|
||||
NULs are preserved. In the latter two cases the preprocessor emits a
|
||||
warning message.
|
||||
|
||||
<div class="footnote">
|
||||
<hr>
|
||||
<h4>Footnotes</h4><p class="footnote"><small>[<a name="fn-1" href="#fnd-1">1</a>]</small> The C
|
||||
standard uses the term <dfn>string literal</dfn> to refer only to what we are
|
||||
calling <dfn>string constants</dfn>.</p>
|
||||
|
||||
<hr></div>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,86 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Traditional Mode - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="prev" href="Preprocessor-Output.html#Preprocessor-Output" title="Preprocessor Output">
|
||||
<link rel="next" href="Implementation-Details.html#Implementation-Details" title="Implementation Details">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Traditional-Mode"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Implementation-Details.html#Implementation-Details">Implementation Details</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Preprocessor-Output.html#Preprocessor-Output">Preprocessor Output</a>,
|
||||
Up: <a rel="up" accesskey="u" href="index.html#Top">Top</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="chapter">10 Traditional Mode</h2>
|
||||
|
||||
<p>Traditional (pre-standard) C preprocessing is rather different from
|
||||
the preprocessing specified by the standard. When GCC is given the
|
||||
<samp><span class="option">-traditional-cpp</span></samp> option, it attempts to emulate a traditional
|
||||
preprocessor.
|
||||
|
||||
<p>GCC versions 3.2 and later only support traditional mode semantics in
|
||||
the preprocessor, and not in the compiler front ends. This chapter
|
||||
outlines the traditional preprocessor semantics we implemented.
|
||||
|
||||
<p>The implementation does not correspond precisely to the behavior of
|
||||
earlier versions of GCC, nor to any true traditional preprocessor.
|
||||
After all, inconsistencies among traditional implementations were a
|
||||
major motivation for C standardization. However, we intend that it
|
||||
should be compatible with true traditional preprocessors in all ways
|
||||
that actually matter.
|
||||
|
||||
<ul class="menu">
|
||||
<li><a accesskey="1" href="Traditional-lexical-analysis.html#Traditional-lexical-analysis">Traditional lexical analysis</a>
|
||||
<li><a accesskey="2" href="Traditional-macros.html#Traditional-macros">Traditional macros</a>
|
||||
<li><a accesskey="3" href="Traditional-miscellany.html#Traditional-miscellany">Traditional miscellany</a>
|
||||
<li><a accesskey="4" href="Traditional-warnings.html#Traditional-warnings">Traditional warnings</a>
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,119 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Traditional lexical analysis - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Traditional-Mode.html#Traditional-Mode" title="Traditional Mode">
|
||||
<link rel="next" href="Traditional-macros.html#Traditional-macros" title="Traditional macros">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Traditional-lexical-analysis"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Traditional-macros.html#Traditional-macros">Traditional macros</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Traditional-Mode.html#Traditional-Mode">Traditional Mode</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">10.1 Traditional lexical analysis</h3>
|
||||
|
||||
<p>The traditional preprocessor does not decompose its input into tokens
|
||||
the same way a standards-conforming preprocessor does. The input is
|
||||
simply treated as a stream of text with minimal internal form.
|
||||
|
||||
<p>This implementation does not treat trigraphs (see <a href="trigraphs.html#trigraphs">trigraphs</a>)
|
||||
specially since they were an invention of the standards committee. It
|
||||
handles arbitrarily-positioned escaped newlines properly and splices
|
||||
the lines as you would expect; many traditional preprocessors did not
|
||||
do this.
|
||||
|
||||
<p>The form of horizontal whitespace in the input file is preserved in
|
||||
the output. In particular, hard tabs remain hard tabs. This can be
|
||||
useful if, for example, you are preprocessing a Makefile.
|
||||
|
||||
<p>Traditional CPP only recognizes C-style block comments, and treats the
|
||||
‘<samp><span class="samp">/*</span></samp>’ sequence as introducing a comment only if it lies outside
|
||||
quoted text. Quoted text is introduced by the usual single and double
|
||||
quotes, and also by an initial ‘<samp><span class="samp"><</span></samp>’ in a <code>#include</code>
|
||||
directive.
|
||||
|
||||
<p>Traditionally, comments are completely removed and are not replaced
|
||||
with a space. Since a traditional compiler does its own tokenization
|
||||
of the output of the preprocessor, this means that comments can
|
||||
effectively be used as token paste operators. However, comments
|
||||
behave like separators for text handled by the preprocessor itself,
|
||||
since it doesn't re-lex its input. For example, in
|
||||
|
||||
<pre class="smallexample"> #if foo/**/bar
|
||||
</pre>
|
||||
<p class="noindent">‘<samp><span class="samp">foo</span></samp>’ and ‘<samp><span class="samp">bar</span></samp>’ are distinct identifiers and expanded
|
||||
separately if they happen to be macros. In other words, this
|
||||
directive is equivalent to
|
||||
|
||||
<pre class="smallexample"> #if foo bar
|
||||
</pre>
|
||||
<p class="noindent">rather than
|
||||
|
||||
<pre class="smallexample"> #if foobar
|
||||
</pre>
|
||||
<p>Generally speaking, in traditional mode an opening quote need not have
|
||||
a matching closing quote. In particular, a macro may be defined with
|
||||
replacement text that contains an unmatched quote. Of course, if you
|
||||
attempt to compile preprocessed output containing an unmatched quote
|
||||
you will get a syntax error.
|
||||
|
||||
<p>However, all preprocessing directives other than <code>#define</code>
|
||||
require matching quotes. For example:
|
||||
|
||||
<pre class="smallexample"> #define m This macro's fine and has an unmatched quote
|
||||
"/* This is not a comment. */
|
||||
/* <span class="roman">This is a comment. The following #include directive
|
||||
is ill-formed.</span> */
|
||||
#include <stdio.h
|
||||
</pre>
|
||||
<p>Just as for the ISO preprocessor, what would be a closing quote can be
|
||||
escaped with a backslash to prevent the quoted text from closing.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,146 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Traditional macros - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Traditional-Mode.html#Traditional-Mode" title="Traditional Mode">
|
||||
<link rel="prev" href="Traditional-lexical-analysis.html#Traditional-lexical-analysis" title="Traditional lexical analysis">
|
||||
<link rel="next" href="Traditional-miscellany.html#Traditional-miscellany" title="Traditional miscellany">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Traditional-macros"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Traditional-miscellany.html#Traditional-miscellany">Traditional miscellany</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Traditional-lexical-analysis.html#Traditional-lexical-analysis">Traditional lexical analysis</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Traditional-Mode.html#Traditional-Mode">Traditional Mode</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">10.2 Traditional macros</h3>
|
||||
|
||||
<p>The major difference between traditional and ISO macros is that the
|
||||
former expand to text rather than to a token sequence. CPP removes
|
||||
all leading and trailing horizontal whitespace from a macro's
|
||||
replacement text before storing it, but preserves the form of internal
|
||||
whitespace.
|
||||
|
||||
<p>One consequence is that it is legitimate for the replacement text to
|
||||
contain an unmatched quote (see <a href="Traditional-lexical-analysis.html#Traditional-lexical-analysis">Traditional lexical analysis</a>). An
|
||||
unclosed string or character constant continues into the text
|
||||
following the macro call. Similarly, the text at the end of a macro's
|
||||
expansion can run together with the text after the macro invocation to
|
||||
produce a single token.
|
||||
|
||||
<p>Normally comments are removed from the replacement text after the
|
||||
macro is expanded, but if the <samp><span class="option">-CC</span></samp> option is passed on the
|
||||
command line comments are preserved. (In fact, the current
|
||||
implementation removes comments even before saving the macro
|
||||
replacement text, but it careful to do it in such a way that the
|
||||
observed effect is identical even in the function-like macro case.)
|
||||
|
||||
<p>The ISO stringification operator ‘<samp><span class="samp">#</span></samp>’ and token paste operator
|
||||
‘<samp><span class="samp">##</span></samp>’ have no special meaning. As explained later, an effect
|
||||
similar to these operators can be obtained in a different way. Macro
|
||||
names that are embedded in quotes, either from the main file or after
|
||||
macro replacement, do not expand.
|
||||
|
||||
<p>CPP replaces an unquoted object-like macro name with its replacement
|
||||
text, and then rescans it for further macros to replace. Unlike
|
||||
standard macro expansion, traditional macro expansion has no provision
|
||||
to prevent recursion. If an object-like macro appears unquoted in its
|
||||
replacement text, it will be replaced again during the rescan pass,
|
||||
and so on <em>ad infinitum</em>. GCC detects when it is expanding
|
||||
recursive macros, emits an error message, and continues after the
|
||||
offending macro invocation.
|
||||
|
||||
<pre class="smallexample"> #define PLUS +
|
||||
#define INC(x) PLUS+x
|
||||
INC(foo);
|
||||
==> ++foo;
|
||||
</pre>
|
||||
<p>Function-like macros are similar in form but quite different in
|
||||
behavior to their ISO counterparts. Their arguments are contained
|
||||
within parentheses, are comma-separated, and can cross physical lines.
|
||||
Commas within nested parentheses are not treated as argument
|
||||
separators. Similarly, a quote in an argument cannot be left
|
||||
unclosed; a following comma or parenthesis that comes before the
|
||||
closing quote is treated like any other character. There is no
|
||||
facility for handling variadic macros.
|
||||
|
||||
<p>This implementation removes all comments from macro arguments, unless
|
||||
the <samp><span class="option">-C</span></samp> option is given. The form of all other horizontal
|
||||
whitespace in arguments is preserved, including leading and trailing
|
||||
whitespace. In particular
|
||||
|
||||
<pre class="smallexample"> f( )
|
||||
</pre>
|
||||
<p class="noindent">is treated as an invocation of the macro ‘<samp><span class="samp">f</span></samp>’ with a single
|
||||
argument consisting of a single space. If you want to invoke a
|
||||
function-like macro that takes no arguments, you must not leave any
|
||||
whitespace between the parentheses.
|
||||
|
||||
<p>If a macro argument crosses a new line, the new line is replaced with
|
||||
a space when forming the argument. If the previous line contained an
|
||||
unterminated quote, the following line inherits the quoted state.
|
||||
|
||||
<p>Traditional preprocessors replace parameters in the replacement text
|
||||
with their arguments regardless of whether the parameters are within
|
||||
quotes or not. This provides a way to stringize arguments. For
|
||||
example
|
||||
|
||||
<pre class="smallexample"> #define str(x) "x"
|
||||
str(/* <span class="roman">A comment</span> */some text )
|
||||
==> "some text "
|
||||
</pre>
|
||||
<p class="noindent">Note that the comment is removed, but that the trailing space is
|
||||
preserved. Here is an example of using a comment to effect token
|
||||
pasting.
|
||||
|
||||
<pre class="smallexample"> #define suffix(x) foo_/**/x
|
||||
suffix(bar)
|
||||
==> foo_bar
|
||||
</pre>
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,88 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Traditional miscellany - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Traditional-Mode.html#Traditional-Mode" title="Traditional Mode">
|
||||
<link rel="prev" href="Traditional-macros.html#Traditional-macros" title="Traditional macros">
|
||||
<link rel="next" href="Traditional-warnings.html#Traditional-warnings" title="Traditional warnings">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Traditional-miscellany"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Traditional-warnings.html#Traditional-warnings">Traditional warnings</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Traditional-macros.html#Traditional-macros">Traditional macros</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Traditional-Mode.html#Traditional-Mode">Traditional Mode</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">10.3 Traditional miscellany</h3>
|
||||
|
||||
<p>Here are some things to be aware of when using the traditional
|
||||
preprocessor.
|
||||
|
||||
<ul>
|
||||
<li>Preprocessing directives are recognized only when their leading
|
||||
‘<samp><span class="samp">#</span></samp>’ appears in the first column. There can be no whitespace
|
||||
between the beginning of the line and the ‘<samp><span class="samp">#</span></samp>’, but whitespace can
|
||||
follow the ‘<samp><span class="samp">#</span></samp>’.
|
||||
|
||||
<li>A true traditional C preprocessor does not recognize ‘<samp><span class="samp">#error</span></samp>’ or
|
||||
‘<samp><span class="samp">#pragma</span></samp>’, and may not recognize ‘<samp><span class="samp">#elif</span></samp>’. CPP supports all
|
||||
the directives in traditional mode that it supports in ISO mode,
|
||||
including extensions, with the exception that the effects of
|
||||
‘<samp><span class="samp">#pragma GCC poison</span></samp>’ are undefined.
|
||||
|
||||
<li>__STDC__ is not defined.
|
||||
|
||||
<li>If you use digraphs the behavior is undefined.
|
||||
|
||||
<li>If a line that looks like a directive appears within macro arguments,
|
||||
the behavior is undefined.
|
||||
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,104 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Traditional warnings - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Traditional-Mode.html#Traditional-Mode" title="Traditional Mode">
|
||||
<link rel="prev" href="Traditional-miscellany.html#Traditional-miscellany" title="Traditional miscellany">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Traditional-warnings"></a>
|
||||
<p>
|
||||
Previous: <a rel="previous" accesskey="p" href="Traditional-miscellany.html#Traditional-miscellany">Traditional miscellany</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Traditional-Mode.html#Traditional-Mode">Traditional Mode</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">10.4 Traditional warnings</h3>
|
||||
|
||||
<p>You can request warnings about features that did not exist, or worked
|
||||
differently, in traditional C with the <samp><span class="option">-Wtraditional</span></samp> option.
|
||||
GCC does not warn about features of ISO C which you must use when you
|
||||
are using a conforming compiler, such as the ‘<samp><span class="samp">#</span></samp>’ and ‘<samp><span class="samp">##</span></samp>’
|
||||
operators.
|
||||
|
||||
<p>Presently <samp><span class="option">-Wtraditional</span></samp> warns about:
|
||||
|
||||
<ul>
|
||||
<li>Macro parameters that appear within string literals in the macro body.
|
||||
In traditional C macro replacement takes place within string literals,
|
||||
but does not in ISO C.
|
||||
|
||||
<li>In traditional C, some preprocessor directives did not exist.
|
||||
Traditional preprocessors would only consider a line to be a directive
|
||||
if the ‘<samp><span class="samp">#</span></samp>’ appeared in column 1 on the line. Therefore
|
||||
<samp><span class="option">-Wtraditional</span></samp> warns about directives that traditional C
|
||||
understands but would ignore because the ‘<samp><span class="samp">#</span></samp>’ does not appear as the
|
||||
first character on the line. It also suggests you hide directives like
|
||||
‘<samp><span class="samp">#pragma</span></samp>’ not understood by traditional C by indenting them. Some
|
||||
traditional implementations would not recognize ‘<samp><span class="samp">#elif</span></samp>’, so it
|
||||
suggests avoiding it altogether.
|
||||
|
||||
<li>A function-like macro that appears without an argument list. In some
|
||||
traditional preprocessors this was an error. In ISO C it merely means
|
||||
that the macro is not expanded.
|
||||
|
||||
<li>The unary plus operator. This did not exist in traditional C.
|
||||
|
||||
<li>The ‘<samp><span class="samp">U</span></samp>’ and ‘<samp><span class="samp">LL</span></samp>’ integer constant suffixes, which were not
|
||||
available in traditional C. (Traditional C does support the ‘<samp><span class="samp">L</span></samp>’
|
||||
suffix for simple long integer constants.) You are not warned about
|
||||
uses of these suffixes in macros defined in system headers. For
|
||||
instance, <code>UINT_MAX</code> may well be defined as <code>4294967295U</code>, but
|
||||
you will not be warned if you use <code>UINT_MAX</code>.
|
||||
|
||||
<p>You can usually avoid the warning, and the related warning about
|
||||
constants which are so large that they are unsigned, by writing the
|
||||
integer constant in question in hexadecimal, with no U suffix. Take
|
||||
care, though, because this gives the wrong result in exotic cases.
|
||||
</ul>
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,111 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Undefining and Redefining Macros - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macros.html#Macros" title="Macros">
|
||||
<link rel="prev" href="Predefined-Macros.html#Predefined-Macros" title="Predefined Macros">
|
||||
<link rel="next" href="Directives-Within-Macro-Arguments.html#Directives-Within-Macro-Arguments" title="Directives Within Macro Arguments">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Undefining-and-Redefining-Macros"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Directives-Within-Macro-Arguments.html#Directives-Within-Macro-Arguments">Directives Within Macro Arguments</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Predefined-Macros.html#Predefined-Macros">Predefined Macros</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macros.html#Macros">Macros</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">3.8 Undefining and Redefining Macros</h3>
|
||||
|
||||
<p><a name="index-undefining-macros-68"></a><a name="index-redefining-macros-69"></a><a name="index-g_t_0023undef-70"></a>
|
||||
If a macro ceases to be useful, it may be <dfn>undefined</dfn> with the
|
||||
‘<samp><span class="samp">#undef</span></samp>’ directive. ‘<samp><span class="samp">#undef</span></samp>’ takes a single argument, the
|
||||
name of the macro to undefine. You use the bare macro name, even if the
|
||||
macro is function-like. It is an error if anything appears on the line
|
||||
after the macro name. ‘<samp><span class="samp">#undef</span></samp>’ has no effect if the name is not a
|
||||
macro.
|
||||
|
||||
<pre class="smallexample"> #define FOO 4
|
||||
x = FOO; ==> x = 4;
|
||||
#undef FOO
|
||||
x = FOO; ==> x = FOO;
|
||||
</pre>
|
||||
<p>Once a macro has been undefined, that identifier may be <dfn>redefined</dfn>
|
||||
as a macro by a subsequent ‘<samp><span class="samp">#define</span></samp>’ directive. The new definition
|
||||
need not have any resemblance to the old definition.
|
||||
|
||||
<p>However, if an identifier which is currently a macro is redefined, then
|
||||
the new definition must be <dfn>effectively the same</dfn> as the old one.
|
||||
Two macro definitions are effectively the same if:
|
||||
<ul>
|
||||
<li>Both are the same type of macro (object- or function-like).
|
||||
<li>All the tokens of the replacement list are the same.
|
||||
<li>If there are any parameters, they are the same.
|
||||
<li>Whitespace appears in the same places in both. It need not be
|
||||
exactly the same amount of whitespace, though. Remember that comments
|
||||
count as whitespace.
|
||||
</ul>
|
||||
|
||||
<p class="noindent">These definitions are effectively the same:
|
||||
<pre class="smallexample"> #define FOUR (2 + 2)
|
||||
#define FOUR (2 + 2)
|
||||
#define FOUR (2 /* <span class="roman">two</span> */ + 2)
|
||||
</pre>
|
||||
<p class="noindent">but these are not:
|
||||
<pre class="smallexample"> #define FOUR (2 + 2)
|
||||
#define FOUR ( 2+2 )
|
||||
#define FOUR (2 * 2)
|
||||
#define FOUR(score,and,seven,years,ago) (2 + 2)
|
||||
</pre>
|
||||
<p>If a macro is redefined with a definition that is not effectively the
|
||||
same as the old one, the preprocessor issues a warning and changes the
|
||||
macro to use the new definition. If the new definition is effectively
|
||||
the same, the redefinition is silently ignored. This allows, for
|
||||
instance, two different headers to define a common macro. The
|
||||
preprocessor will only complain if the definitions do not match.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,166 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Variadic Macros - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Macros.html#Macros" title="Macros">
|
||||
<link rel="prev" href="Concatenation.html#Concatenation" title="Concatenation">
|
||||
<link rel="next" href="Predefined-Macros.html#Predefined-Macros" title="Predefined Macros">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Variadic-Macros"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Predefined-Macros.html#Predefined-Macros">Predefined Macros</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Concatenation.html#Concatenation">Concatenation</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Macros.html#Macros">Macros</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">3.6 Variadic Macros</h3>
|
||||
|
||||
<p><a name="index-variable-number-of-arguments-56"></a><a name="index-macros-with-variable-arguments-57"></a><a name="index-variadic-macros-58"></a>
|
||||
A macro can be declared to accept a variable number of arguments much as
|
||||
a function can. The syntax for defining the macro is similar to that of
|
||||
a function. Here is an example:
|
||||
|
||||
<pre class="smallexample"> #define eprintf(...) fprintf (stderr, __VA_ARGS__)
|
||||
</pre>
|
||||
<p>This kind of macro is called <dfn>variadic</dfn>. When the macro is invoked,
|
||||
all the tokens in its argument list after the last named argument (this
|
||||
macro has none), including any commas, become the <dfn>variable
|
||||
argument</dfn>. This sequence of tokens replaces the identifier
|
||||
<code>__VA_ARGS__<!-- /@w --></code> in the macro body wherever it appears. Thus, we
|
||||
have this expansion:
|
||||
|
||||
<pre class="smallexample"> eprintf ("%s:%d: ", input_file, lineno)
|
||||
==> fprintf (stderr, "%s:%d: ", input_file, lineno)
|
||||
</pre>
|
||||
<p>The variable argument is completely macro-expanded before it is inserted
|
||||
into the macro expansion, just like an ordinary argument. You may use
|
||||
the ‘<samp><span class="samp">#</span></samp>’ and ‘<samp><span class="samp">##</span></samp>’ operators to stringify the variable argument
|
||||
or to paste its leading or trailing token with another token. (But see
|
||||
below for an important special case for ‘<samp><span class="samp">##</span></samp>’.)
|
||||
|
||||
<p>If your macro is complicated, you may want a more descriptive name for
|
||||
the variable argument than <code>__VA_ARGS__<!-- /@w --></code>. CPP permits
|
||||
this, as an extension. You may write an argument name immediately
|
||||
before the ‘<samp><span class="samp">...</span></samp>’; that name is used for the variable argument.
|
||||
The <code>eprintf</code> macro above could be written
|
||||
|
||||
<pre class="smallexample"> #define eprintf(args...) fprintf (stderr, args)
|
||||
</pre>
|
||||
<p class="noindent">using this extension. You cannot use <code>__VA_ARGS__<!-- /@w --></code> and this
|
||||
extension in the same macro.
|
||||
|
||||
<p>You can have named arguments as well as variable arguments in a variadic
|
||||
macro. We could define <code>eprintf</code> like this, instead:
|
||||
|
||||
<pre class="smallexample"> #define eprintf(format, ...) fprintf (stderr, format, __VA_ARGS__)
|
||||
</pre>
|
||||
<p class="noindent">This formulation looks more descriptive, but unfortunately it is less
|
||||
flexible: you must now supply at least one argument after the format
|
||||
string. In standard C, you cannot omit the comma separating the named
|
||||
argument from the variable arguments. Furthermore, if you leave the
|
||||
variable argument empty, you will get a syntax error, because
|
||||
there will be an extra comma after the format string.
|
||||
|
||||
<pre class="smallexample"> eprintf("success!\n", );
|
||||
==> fprintf(stderr, "success!\n", );
|
||||
</pre>
|
||||
<p>GNU CPP has a pair of extensions which deal with this problem. First,
|
||||
you are allowed to leave the variable argument out entirely:
|
||||
|
||||
<pre class="smallexample"> eprintf ("success!\n")
|
||||
==> fprintf(stderr, "success!\n", );
|
||||
</pre>
|
||||
<p class="noindent">Second, the ‘<samp><span class="samp">##</span></samp>’ token paste operator has a special meaning when
|
||||
placed between a comma and a variable argument. If you write
|
||||
|
||||
<pre class="smallexample"> #define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
|
||||
</pre>
|
||||
<p class="noindent">and the variable argument is left out when the <code>eprintf</code> macro is
|
||||
used, then the comma before the ‘<samp><span class="samp">##</span></samp>’ will be deleted. This does
|
||||
<em>not</em> happen if you pass an empty argument, nor does it happen if
|
||||
the token preceding ‘<samp><span class="samp">##</span></samp>’ is anything other than a comma.
|
||||
|
||||
<pre class="smallexample"> eprintf ("success!\n")
|
||||
==> fprintf(stderr, "success!\n");
|
||||
</pre>
|
||||
<p class="noindent">The above explanation is ambiguous about the case where the only macro
|
||||
parameter is a variable arguments parameter, as it is meaningless to
|
||||
try to distinguish whether no argument at all is an empty argument or
|
||||
a missing argument. In this case the C99 standard is clear that the
|
||||
comma must remain, however the existing GCC extension used to swallow
|
||||
the comma. So CPP retains the comma when conforming to a specific C
|
||||
standard, and drops it otherwise.
|
||||
|
||||
<p>C99 mandates that the only place the identifier <code>__VA_ARGS__<!-- /@w --></code>
|
||||
can appear is in the replacement list of a variadic macro. It may not
|
||||
be used as a macro name, macro argument name, or within a different type
|
||||
of macro. It may also be forbidden in open text; the standard is
|
||||
ambiguous. We recommend you avoid using it except for its defined
|
||||
purpose.
|
||||
|
||||
<p>Variadic macros are a new feature in C99. GNU CPP has supported them
|
||||
for a long time, but only with a named variable argument
|
||||
(‘<samp><span class="samp">args...</span></samp>’, not ‘<samp><span class="samp">...</span></samp>’ and <code>__VA_ARGS__<!-- /@w --></code>). If you are
|
||||
concerned with portability to previous versions of GCC, you should use
|
||||
only named variable arguments. On the other hand, if you are concerned
|
||||
with portability to other conforming implementations of C99, you should
|
||||
use only <code>__VA_ARGS__<!-- /@w --></code>.
|
||||
|
||||
<p>Previous versions of CPP implemented the comma-deletion extension
|
||||
much more generally. We have restricted it in this release to minimize
|
||||
the differences from C99. To get the same effect with both this and
|
||||
previous versions of GCC, the token preceding the special ‘<samp><span class="samp">##</span></samp>’ must
|
||||
be a comma, and there must be white space between that comma and
|
||||
whatever comes immediately before it:
|
||||
|
||||
<pre class="smallexample"> #define eprintf(format, args...) fprintf (stderr, format , ##args)
|
||||
</pre>
|
||||
<p class="noindent">See <a href="Differences-from-previous-versions.html#Differences-from-previous-versions">Differences from previous versions</a>, for the gory details.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1,108 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Wrapper Headers - The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="index.html#Top">
|
||||
<link rel="up" href="Header-Files.html#Header-Files" title="Header Files">
|
||||
<link rel="prev" href="Computed-Includes.html#Computed-Includes" title="Computed Includes">
|
||||
<link rel="next" href="System-Headers.html#System-Headers" title="System Headers">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled ``GNU Free Documentation License''.
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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="Wrapper-Headers"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="System-Headers.html#System-Headers">System Headers</a>,
|
||||
Previous: <a rel="previous" accesskey="p" href="Computed-Includes.html#Computed-Includes">Computed Includes</a>,
|
||||
Up: <a rel="up" accesskey="u" href="Header-Files.html#Header-Files">Header Files</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h3 class="section">2.7 Wrapper Headers</h3>
|
||||
|
||||
<p><a name="index-wrapper-headers-36"></a><a name="index-overriding-a-header-file-37"></a><a name="index-g_t_0023include_005fnext-38"></a>
|
||||
Sometimes it is necessary to adjust the contents of a system-provided
|
||||
header file without editing it directly. GCC's <samp><span class="command">fixincludes</span></samp>
|
||||
operation does this, for example. One way to do that would be to create
|
||||
a new header file with the same name and insert it in the search path
|
||||
before the original header. That works fine as long as you're willing
|
||||
to replace the old header entirely. But what if you want to refer to
|
||||
the old header from the new one?
|
||||
|
||||
<p>You cannot simply include the old header with ‘<samp><span class="samp">#include</span></samp>’. That
|
||||
will start from the beginning, and find your new header again. If your
|
||||
header is not protected from multiple inclusion (see <a href="Once_002dOnly-Headers.html#Once_002dOnly-Headers">Once-Only Headers</a>), it will recurse infinitely and cause a fatal error.
|
||||
|
||||
<p>You could include the old header with an absolute pathname:
|
||||
<pre class="smallexample"> #include "/usr/include/old-header.h"
|
||||
</pre>
|
||||
<p class="noindent">This works, but is not clean; should the system headers ever move, you
|
||||
would have to edit the new headers to match.
|
||||
|
||||
<p>There is no way to solve this problem within the C standard, but you can
|
||||
use the GNU extension ‘<samp><span class="samp">#include_next</span></samp>’. It means, “Include the
|
||||
<em>next</em> file with this name”. This directive works like
|
||||
‘<samp><span class="samp">#include</span></samp>’ except in searching for the specified file: it starts
|
||||
searching the list of header file directories <em>after</em> the directory
|
||||
in which the current file was found.
|
||||
|
||||
<p>Suppose you specify <samp><span class="option">-I /usr/local/include</span></samp>, and the list of
|
||||
directories to search also includes <samp><span class="file">/usr/include</span></samp>; and suppose
|
||||
both directories contain <samp><span class="file">signal.h</span></samp>. Ordinary <code>#include <signal.h><!-- /@w --></code> finds the file under <samp><span class="file">/usr/local/include</span></samp>. If that
|
||||
file contains <code>#include_next <signal.h><!-- /@w --></code>, it starts searching
|
||||
after that directory, and finds the file in <samp><span class="file">/usr/include</span></samp>.
|
||||
|
||||
<p>‘<samp><span class="samp">#include_next</span></samp>’ does not distinguish between <code><</code><var>file</var><code>></code>
|
||||
and <code>"</code><var>file</var><code>"</code> inclusion, nor does it check that the file you
|
||||
specify has the same name as the current file. It simply looks for the
|
||||
file named, starting with the directory in the search path after the one
|
||||
where the current file was found.
|
||||
|
||||
<p>The use of ‘<samp><span class="samp">#include_next</span></samp>’ can lead to great confusion. We
|
||||
recommend it be used only when there is no other alternative. In
|
||||
particular, it should not be used in the headers belonging to a specific
|
||||
program; it should be used only to make global corrections along the
|
||||
lines of <samp><span class="command">fixincludes</span></samp>.
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1 @@
|
||||
<meta http-equiv="refresh" content="0; url=Invocation.html#Wtrigraphs">
|
@@ -0,0 +1 @@
|
||||
<meta http-equiv="refresh" content="0; url=Invocation.html#dashMF">
|
@@ -0,0 +1 @@
|
||||
<meta http-equiv="refresh" content="0; url=Invocation.html#fdollars%2din%2didentifiers">
|
@@ -0,0 +1,315 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>The C Preprocessor</title>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
<meta name="description" content="The C Preprocessor">
|
||||
<meta name="generator" content="makeinfo 4.13">
|
||||
<link title="Top" rel="start" href="#Top">
|
||||
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
||||
<!--
|
||||
Copyright (C) 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
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. A copy of
|
||||
the license is included in the
|
||||
section entitled "GNU Free Documentation License".
|
||||
|
||||
This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
(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>
|
||||
<h1 class="settitle">The C Preprocessor</h1>
|
||||
<div class="contents">
|
||||
<h2>Table of Contents</h2>
|
||||
<ul>
|
||||
<li><a name="toc_Top" href="index.html#Top">The C Preprocessor</a>
|
||||
<li><a name="toc_Overview" href="Overview.html#Overview">1 Overview</a>
|
||||
<ul>
|
||||
<li><a href="Character-sets.html#Character-sets">1.1 Character sets</a>
|
||||
<li><a href="Initial-processing.html#Initial-processing">1.2 Initial processing</a>
|
||||
<li><a href="Tokenization.html#Tokenization">1.3 Tokenization</a>
|
||||
<li><a href="The-preprocessing-language.html#The-preprocessing-language">1.4 The preprocessing language</a>
|
||||
</li></ul>
|
||||
<li><a name="toc_Header-Files" href="Header-Files.html#Header-Files">2 Header Files</a>
|
||||
<ul>
|
||||
<li><a href="Include-Syntax.html#Include-Syntax">2.1 Include Syntax</a>
|
||||
<li><a href="Include-Operation.html#Include-Operation">2.2 Include Operation</a>
|
||||
<li><a href="Search-Path.html#Search-Path">2.3 Search Path</a>
|
||||
<li><a href="Once_002dOnly-Headers.html#Once_002dOnly-Headers">2.4 Once-Only Headers</a>
|
||||
<li><a href="Alternatives-to-Wrapper-_0023ifndef.html#Alternatives-to-Wrapper-_0023ifndef">2.5 Alternatives to Wrapper #ifndef</a>
|
||||
<li><a href="Computed-Includes.html#Computed-Includes">2.6 Computed Includes</a>
|
||||
<li><a href="Wrapper-Headers.html#Wrapper-Headers">2.7 Wrapper Headers</a>
|
||||
<li><a href="System-Headers.html#System-Headers">2.8 System Headers</a>
|
||||
</li></ul>
|
||||
<li><a name="toc_Macros" href="Macros.html#Macros">3 Macros</a>
|
||||
<ul>
|
||||
<li><a href="Object_002dlike-Macros.html#Object_002dlike-Macros">3.1 Object-like Macros</a>
|
||||
<li><a href="Function_002dlike-Macros.html#Function_002dlike-Macros">3.2 Function-like Macros</a>
|
||||
<li><a href="Macro-Arguments.html#Macro-Arguments">3.3 Macro Arguments</a>
|
||||
<li><a href="Stringification.html#Stringification">3.4 Stringification</a>
|
||||
<li><a href="Concatenation.html#Concatenation">3.5 Concatenation</a>
|
||||
<li><a href="Variadic-Macros.html#Variadic-Macros">3.6 Variadic Macros</a>
|
||||
<li><a href="Predefined-Macros.html#Predefined-Macros">3.7 Predefined Macros</a>
|
||||
<ul>
|
||||
<li><a href="Standard-Predefined-Macros.html#Standard-Predefined-Macros">3.7.1 Standard Predefined Macros</a>
|
||||
<li><a href="Common-Predefined-Macros.html#Common-Predefined-Macros">3.7.2 Common Predefined Macros</a>
|
||||
<li><a href="System_002dspecific-Predefined-Macros.html#System_002dspecific-Predefined-Macros">3.7.3 System-specific Predefined Macros</a>
|
||||
<li><a href="C_002b_002b-Named-Operators.html#C_002b_002b-Named-Operators">3.7.4 C++ Named Operators</a>
|
||||
</li></ul>
|
||||
<li><a href="Undefining-and-Redefining-Macros.html#Undefining-and-Redefining-Macros">3.8 Undefining and Redefining Macros</a>
|
||||
<li><a href="Directives-Within-Macro-Arguments.html#Directives-Within-Macro-Arguments">3.9 Directives Within Macro Arguments</a>
|
||||
<li><a href="Macro-Pitfalls.html#Macro-Pitfalls">3.10 Macro Pitfalls</a>
|
||||
<ul>
|
||||
<li><a href="Misnesting.html#Misnesting">3.10.1 Misnesting</a>
|
||||
<li><a href="Operator-Precedence-Problems.html#Operator-Precedence-Problems">3.10.2 Operator Precedence Problems</a>
|
||||
<li><a href="Swallowing-the-Semicolon.html#Swallowing-the-Semicolon">3.10.3 Swallowing the Semicolon</a>
|
||||
<li><a href="Duplication-of-Side-Effects.html#Duplication-of-Side-Effects">3.10.4 Duplication of Side Effects</a>
|
||||
<li><a href="Self_002dReferential-Macros.html#Self_002dReferential-Macros">3.10.5 Self-Referential Macros</a>
|
||||
<li><a href="Argument-Prescan.html#Argument-Prescan">3.10.6 Argument Prescan</a>
|
||||
<li><a href="Newlines-in-Arguments.html#Newlines-in-Arguments">3.10.7 Newlines in Arguments</a>
|
||||
</li></ul>
|
||||
</li></ul>
|
||||
<li><a name="toc_Conditionals" href="Conditionals.html#Conditionals">4 Conditionals</a>
|
||||
<ul>
|
||||
<li><a href="Conditional-Uses.html#Conditional-Uses">4.1 Conditional Uses</a>
|
||||
<li><a href="Conditional-Syntax.html#Conditional-Syntax">4.2 Conditional Syntax</a>
|
||||
<ul>
|
||||
<li><a href="Ifdef.html#Ifdef">4.2.1 Ifdef</a>
|
||||
<li><a href="If.html#If">4.2.2 If</a>
|
||||
<li><a href="Defined.html#Defined">4.2.3 Defined</a>
|
||||
<li><a href="Else.html#Else">4.2.4 Else</a>
|
||||
<li><a href="Elif.html#Elif">4.2.5 Elif</a>
|
||||
</li></ul>
|
||||
<li><a href="Deleted-Code.html#Deleted-Code">4.3 Deleted Code</a>
|
||||
</li></ul>
|
||||
<li><a name="toc_Diagnostics" href="Diagnostics.html#Diagnostics">5 Diagnostics</a>
|
||||
<li><a name="toc_Line-Control" href="Line-Control.html#Line-Control">6 Line Control</a>
|
||||
<li><a name="toc_Pragmas" href="Pragmas.html#Pragmas">7 Pragmas</a>
|
||||
<li><a name="toc_Other-Directives" href="Other-Directives.html#Other-Directives">8 Other Directives</a>
|
||||
<li><a name="toc_Preprocessor-Output" href="Preprocessor-Output.html#Preprocessor-Output">9 Preprocessor Output</a>
|
||||
<li><a name="toc_Traditional-Mode" href="Traditional-Mode.html#Traditional-Mode">10 Traditional Mode</a>
|
||||
<ul>
|
||||
<li><a href="Traditional-lexical-analysis.html#Traditional-lexical-analysis">10.1 Traditional lexical analysis</a>
|
||||
<li><a href="Traditional-macros.html#Traditional-macros">10.2 Traditional macros</a>
|
||||
<li><a href="Traditional-miscellany.html#Traditional-miscellany">10.3 Traditional miscellany</a>
|
||||
<li><a href="Traditional-warnings.html#Traditional-warnings">10.4 Traditional warnings</a>
|
||||
</li></ul>
|
||||
<li><a name="toc_Implementation-Details" href="Implementation-Details.html#Implementation-Details">11 Implementation Details</a>
|
||||
<ul>
|
||||
<li><a href="Implementation_002ddefined-behavior.html#Implementation_002ddefined-behavior">11.1 Implementation-defined behavior</a>
|
||||
<li><a href="Implementation-limits.html#Implementation-limits">11.2 Implementation limits</a>
|
||||
<li><a href="Obsolete-Features.html#Obsolete-Features">11.3 Obsolete Features</a>
|
||||
<ul>
|
||||
<li><a href="Obsolete-Features.html#Obsolete-Features">11.3.1 Assertions</a>
|
||||
</li></ul>
|
||||
<li><a href="Differences-from-previous-versions.html#Differences-from-previous-versions">11.4 Differences from previous versions</a>
|
||||
</li></ul>
|
||||
<li><a name="toc_Invocation" href="Invocation.html#Invocation">12 Invocation</a>
|
||||
<li><a name="toc_Environment-Variables" href="Environment-Variables.html#Environment-Variables">13 Environment Variables</a>
|
||||
<li><a name="toc_GNU-Free-Documentation-License" href="GNU-Free-Documentation-License.html#GNU-Free-Documentation-License">GNU Free Documentation License</a>
|
||||
<ul>
|
||||
<li><a href="GNU-Free-Documentation-License.html#GNU-Free-Documentation-License">ADDENDUM: How to use this License for your documents</a>
|
||||
</li></ul>
|
||||
<li><a name="toc_Index-of-Directives" href="Index-of-Directives.html#Index-of-Directives">Index of Directives</a>
|
||||
<li><a name="toc_Option-Index" href="Option-Index.html#Option-Index">Option Index</a>
|
||||
<li><a name="toc_Concept-Index" href="Concept-Index.html#Concept-Index">Concept Index</a>
|
||||
</li></ul>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="node">
|
||||
<a name="Top"></a>
|
||||
<p>
|
||||
Next: <a rel="next" accesskey="n" href="Overview.html#Overview">Overview</a>,
|
||||
Up: <a rel="up" accesskey="u" href="../index.html#dir">(dir)</a>
|
||||
<hr>
|
||||
</div>
|
||||
|
||||
<h2 class="unnumbered">The C Preprocessor</h2>
|
||||
|
||||
<p>The C preprocessor implements the macro language used to transform C,
|
||||
C++, and Objective-C programs before they are compiled. It can also be
|
||||
useful on its own.
|
||||
|
||||
<ul class="menu">
|
||||
<li><a accesskey="1" href="Overview.html#Overview">Overview</a>
|
||||
<li><a accesskey="2" href="Header-Files.html#Header-Files">Header Files</a>
|
||||
<li><a accesskey="3" href="Macros.html#Macros">Macros</a>
|
||||
<li><a accesskey="4" href="Conditionals.html#Conditionals">Conditionals</a>
|
||||
<li><a accesskey="5" href="Diagnostics.html#Diagnostics">Diagnostics</a>
|
||||
<li><a accesskey="6" href="Line-Control.html#Line-Control">Line Control</a>
|
||||
<li><a accesskey="7" href="Pragmas.html#Pragmas">Pragmas</a>
|
||||
<li><a accesskey="8" href="Other-Directives.html#Other-Directives">Other Directives</a>
|
||||
<li><a accesskey="9" href="Preprocessor-Output.html#Preprocessor-Output">Preprocessor Output</a>
|
||||
<li><a href="Traditional-Mode.html#Traditional-Mode">Traditional Mode</a>
|
||||
<li><a href="Implementation-Details.html#Implementation-Details">Implementation Details</a>
|
||||
<li><a href="Invocation.html#Invocation">Invocation</a>
|
||||
<li><a href="Environment-Variables.html#Environment-Variables">Environment Variables</a>
|
||||
<li><a href="GNU-Free-Documentation-License.html#GNU-Free-Documentation-License">GNU Free Documentation License</a>
|
||||
<li><a href="Index-of-Directives.html#Index-of-Directives">Index of Directives</a>
|
||||
<li><a href="Option-Index.html#Option-Index">Option Index</a>
|
||||
<li><a href="Concept-Index.html#Concept-Index">Concept Index</a>
|
||||
|
||||
</li></ul>
|
||||
<p>--- The Detailed Node Listing ---
|
||||
|
||||
<p>Overview
|
||||
|
||||
</p>
|
||||
<ul class="menu">
|
||||
<li><a href="Character-sets.html#Character-sets">Character sets</a>
|
||||
<li><a href="Initial-processing.html#Initial-processing">Initial processing</a>
|
||||
<li><a href="Tokenization.html#Tokenization">Tokenization</a>
|
||||
<li><a href="The-preprocessing-language.html#The-preprocessing-language">The preprocessing language</a>
|
||||
|
||||
</li></ul>
|
||||
<p>Header Files
|
||||
|
||||
</p>
|
||||
<ul class="menu">
|
||||
<li><a href="Include-Syntax.html#Include-Syntax">Include Syntax</a>
|
||||
<li><a href="Include-Operation.html#Include-Operation">Include Operation</a>
|
||||
<li><a href="Search-Path.html#Search-Path">Search Path</a>
|
||||
<li><a href="Once_002dOnly-Headers.html#Once_002dOnly-Headers">Once-Only Headers</a>
|
||||
<li><a href="Alternatives-to-Wrapper-_0023ifndef.html#Alternatives-to-Wrapper-_0023ifndef">Alternatives to Wrapper #ifndef</a>
|
||||
<li><a href="Computed-Includes.html#Computed-Includes">Computed Includes</a>
|
||||
<li><a href="Wrapper-Headers.html#Wrapper-Headers">Wrapper Headers</a>
|
||||
<li><a href="System-Headers.html#System-Headers">System Headers</a>
|
||||
|
||||
</li></ul>
|
||||
<p>Macros
|
||||
|
||||
</p>
|
||||
<ul class="menu">
|
||||
<li><a href="Object_002dlike-Macros.html#Object_002dlike-Macros">Object-like Macros</a>
|
||||
<li><a href="Function_002dlike-Macros.html#Function_002dlike-Macros">Function-like Macros</a>
|
||||
<li><a href="Macro-Arguments.html#Macro-Arguments">Macro Arguments</a>
|
||||
<li><a href="Stringification.html#Stringification">Stringification</a>
|
||||
<li><a href="Concatenation.html#Concatenation">Concatenation</a>
|
||||
<li><a href="Variadic-Macros.html#Variadic-Macros">Variadic Macros</a>
|
||||
<li><a href="Predefined-Macros.html#Predefined-Macros">Predefined Macros</a>
|
||||
<li><a href="Undefining-and-Redefining-Macros.html#Undefining-and-Redefining-Macros">Undefining and Redefining Macros</a>
|
||||
<li><a href="Directives-Within-Macro-Arguments.html#Directives-Within-Macro-Arguments">Directives Within Macro Arguments</a>
|
||||
<li><a href="Macro-Pitfalls.html#Macro-Pitfalls">Macro Pitfalls</a>
|
||||
|
||||
</li></ul>
|
||||
<p>Predefined Macros
|
||||
|
||||
</p>
|
||||
<ul class="menu">
|
||||
<li><a href="Standard-Predefined-Macros.html#Standard-Predefined-Macros">Standard Predefined Macros</a>
|
||||
<li><a href="Common-Predefined-Macros.html#Common-Predefined-Macros">Common Predefined Macros</a>
|
||||
<li><a href="System_002dspecific-Predefined-Macros.html#System_002dspecific-Predefined-Macros">System-specific Predefined Macros</a>
|
||||
<li><a href="C_002b_002b-Named-Operators.html#C_002b_002b-Named-Operators">C++ Named Operators</a>
|
||||
|
||||
</li></ul>
|
||||
<p>Macro Pitfalls
|
||||
|
||||
</p>
|
||||
<ul class="menu">
|
||||
<li><a href="Misnesting.html#Misnesting">Misnesting</a>
|
||||
<li><a href="Operator-Precedence-Problems.html#Operator-Precedence-Problems">Operator Precedence Problems</a>
|
||||
<li><a href="Swallowing-the-Semicolon.html#Swallowing-the-Semicolon">Swallowing the Semicolon</a>
|
||||
<li><a href="Duplication-of-Side-Effects.html#Duplication-of-Side-Effects">Duplication of Side Effects</a>
|
||||
<li><a href="Self_002dReferential-Macros.html#Self_002dReferential-Macros">Self-Referential Macros</a>
|
||||
<li><a href="Argument-Prescan.html#Argument-Prescan">Argument Prescan</a>
|
||||
<li><a href="Newlines-in-Arguments.html#Newlines-in-Arguments">Newlines in Arguments</a>
|
||||
|
||||
</li></ul>
|
||||
<p>Conditionals
|
||||
|
||||
</p>
|
||||
<ul class="menu">
|
||||
<li><a href="Conditional-Uses.html#Conditional-Uses">Conditional Uses</a>
|
||||
<li><a href="Conditional-Syntax.html#Conditional-Syntax">Conditional Syntax</a>
|
||||
<li><a href="Deleted-Code.html#Deleted-Code">Deleted Code</a>
|
||||
|
||||
</li></ul>
|
||||
<p>Conditional Syntax
|
||||
|
||||
</p>
|
||||
<ul class="menu">
|
||||
<li><a href="Ifdef.html#Ifdef">Ifdef</a>
|
||||
<li><a href="If.html#If">If</a>
|
||||
<li><a href="Defined.html#Defined">Defined</a>
|
||||
<li><a href="Else.html#Else">Else</a>
|
||||
<li><a href="Elif.html#Elif">Elif</a>
|
||||
|
||||
</li></ul>
|
||||
<p>Implementation Details
|
||||
|
||||
</p>
|
||||
<ul class="menu">
|
||||
<li><a href="Implementation_002ddefined-behavior.html#Implementation_002ddefined-behavior">Implementation-defined behavior</a>
|
||||
<li><a href="Implementation-limits.html#Implementation-limits">Implementation limits</a>
|
||||
<li><a href="Obsolete-Features.html#Obsolete-Features">Obsolete Features</a>
|
||||
<li><a href="Differences-from-previous-versions.html#Differences-from-previous-versions">Differences from previous versions</a>
|
||||
|
||||
</li></ul>
|
||||
<p>Obsolete Features
|
||||
|
||||
</p>
|
||||
<ul class="menu">
|
||||
<li><a href="Obsolete-Features.html#Obsolete-Features">Obsolete Features</a>
|
||||
|
||||
</ul>
|
||||
|
||||
<!-- man begin COPYRIGHT -->
|
||||
<p>Copyright © 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
|
||||
2008, 2009, 2010
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
<p>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. A copy of
|
||||
the license is included in the
|
||||
<!-- man end -->
|
||||
section entitled “GNU Free Documentation License”.
|
||||
|
||||
<!-- man begin COPYRIGHT -->
|
||||
<p>This manual contains no Invariant Sections. The Front-Cover Texts are
|
||||
(a) (see below), and the Back-Cover Texts are (b) (see below).
|
||||
|
||||
<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.
|
||||
<!-- man end -->
|
||||
|
||||
</body></html>
|
||||
|
@@ -0,0 +1 @@
|
||||
<meta http-equiv="refresh" content="0; url=Initial-processing.html#trigraphs">
|
Reference in New Issue
Block a user