toolchain/gcc-linaro-6.3.1-2017.02-x8.../share/doc/cpp/The-preprocessing-language....

155 lines
7.0 KiB
HTML
Raw Normal View History

2024-03-22 05:10:17 +00:00
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1987-2016 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.3 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. -->
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>The C Preprocessor: The preprocessing language</title>
<meta name="description" content="The C Preprocessor: The preprocessing language">
<meta name="keywords" content="The C Preprocessor: The preprocessing language">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Index-of-Directives.html#Index-of-Directives" rel="index" title="Index of Directives">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Overview.html#Overview" rel="up" title="Overview">
<link href="Header-Files.html#Header-Files" rel="next" title="Header Files">
<link href="Tokenization.html#Tokenization" rel="prev" title="Tokenization">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
</head>
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="The-preprocessing-language"></a>
<div class="header">
<p>
Previous: <a href="Tokenization.html#Tokenization" accesskey="p" rel="prev">Tokenization</a>, Up: <a href="Overview.html#Overview" accesskey="u" rel="up">Overview</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Index-of-Directives.html#Index-of-Directives" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="The-preprocessing-language-1"></a>
<h3 class="section">1.4 The preprocessing language</h3>
<a name="index-directives"></a>
<a name="index-preprocessing-directives"></a>
<a name="index-directive-line"></a>
<a name="index-directive-name"></a>
<p>After tokenization, the stream of tokens may simply be passed straight
to the compiler&rsquo;s parser. However, if it contains any operations in the
<em>preprocessing language</em>, it will be transformed first. This stage
corresponds roughly to the standard&rsquo;s &ldquo;translation phase 4&rdquo; and is
what most people think of as the preprocessor&rsquo;s job.
</p>
<p>The preprocessing language consists of <em>directives</em> to be executed
and <em>macros</em> to be expanded. Its primary capabilities are:
</p>
<ul>
<li> Inclusion of header files. These are files of declarations that can be
substituted into your program.
</li><li> Macro expansion. You can define <em>macros</em>, 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><li> Conditional compilation. You can include or exclude parts of the
program according to various conditions.
</li><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><li> Diagnostics. You can detect problems at compile time and issue errors
or warnings.
</li></ul>
<p>There are a few more, less useful, features.
</p>
<p>Except for expansion of predefined macros, all these operations are
triggered with <em>preprocessing directives</em>. Preprocessing directives
are lines in your program that start with &lsquo;<samp>#</samp>&rsquo;. Whitespace is
allowed before and after the &lsquo;<samp>#</samp>&rsquo;. The &lsquo;<samp>#</samp>&rsquo; is followed by an
identifier, the <em>directive name</em>. It specifies the operation to
perform. Directives are commonly referred to as &lsquo;<samp>#<var>name</var></samp>&rsquo;
where <var>name</var> is the directive name. For example, &lsquo;<samp>#define</samp>&rsquo; is
the directive that defines a macro.
</p>
<p>The &lsquo;<samp>#</samp>&rsquo; 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 &lsquo;<samp>#foo</samp>&rsquo; a valid preprocessing directive.
</p>
<p>The set of valid directive names is fixed. Programs cannot define new
preprocessing directives.
</p>
<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, &lsquo;<samp>#define</samp>&rsquo; must be followed by a macro
name and the intended expansion of the macro.
</p>
<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.
</p>
<hr>
<div class="header">
<p>
Previous: <a href="Tokenization.html#Tokenization" accesskey="p" rel="prev">Tokenization</a>, Up: <a href="Overview.html#Overview" accesskey="u" rel="up">Overview</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Index-of-Directives.html#Index-of-Directives" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>