source: public/doc/gnu-c/Once_002dOnly-Headers.html@ 02598c2

Last change on this file since 02598c2 was 02598c2, checked in by Mikhail Kirillov <w96k@…>, on Oct 6, 2022 at 12:36:29 PM

Add gnu-c

  • Property mode set to 100644
File size: 5.3 KB
Line 
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<!-- Copyright (C) 2022 Richard Stallman and Free Software Foundation, Inc.
4
5(The work of Trevis Rothwell and Nelson Beebe has been assigned or
6licensed to the FSF.)
7
8Permission is granted to copy, distribute and/or modify this document
9under the terms of the GNU Free Documentation License, Version 1.3 or
10any later version published by the Free Software Foundation; with the
11Invariant Sections being "GNU General Public License," with the
12Front-Cover Texts being "A GNU Manual," and with the Back-Cover
13Texts as in (a) below. A copy of the license is included in the
14section entitled "GNU Free Documentation License."
15
16(a) The FSF's Back-Cover Text is: "You have the freedom to copy and
17modify this GNU manual. Buying copies from the FSF supports it in
18developing GNU and promoting software freedom." -->
19<!-- Created by GNU Texinfo 6.7, http://www.gnu.org/software/texinfo/ -->
20<head>
21<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
22<title>Once-Only Headers (GNU C Language Manual)</title>
23
24<meta name="description" content="Once-Only Headers (GNU C Language Manual)">
25<meta name="keywords" content="Once-Only Headers (GNU C Language Manual)">
26<meta name="resource-type" content="document">
27<meta name="distribution" content="global">
28<meta name="Generator" content="makeinfo">
29<link href="index.html" rel="start" title="Top">
30<link href="Symbol-Index.html" rel="index" title="Symbol Index">
31<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
32<link href="Header-Files.html" rel="up" title="Header Files">
33<link href="Computed-Includes.html" rel="next" title="Computed Includes">
34<link href="Search-Path.html" rel="prev" title="Search Path">
35<style type="text/css">
36<!--
37a.summary-letter {text-decoration: none}
38blockquote.indentedblock {margin-right: 0em}
39div.display {margin-left: 3.2em}
40div.example {margin-left: 3.2em}
41div.lisp {margin-left: 3.2em}
42kbd {font-style: oblique}
43pre.display {font-family: inherit}
44pre.format {font-family: inherit}
45pre.menu-comment {font-family: serif}
46pre.menu-preformatted {font-family: serif}
47span.nolinebreak {white-space: nowrap}
48span.roman {font-family: initial; font-weight: normal}
49span.sansserif {font-family: sans-serif; font-weight: normal}
50ul.no-bullet {list-style: none}
51-->
52</style>
53
54
55</head>
56
57<body lang="en">
58<span id="Once_002dOnly-Headers"></span><div class="header">
59<p>
60Next: <a href="Computed-Includes.html" accesskey="n" rel="next">Computed Includes</a>, Previous: <a href="Search-Path.html" accesskey="p" rel="prev">Search Path</a>, Up: <a href="Header-Files.html" accesskey="u" rel="up">Header Files</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Symbol-Index.html" title="Index" rel="index">Index</a>]</p>
61</div>
62<hr>
63<span id="Once_002dOnly-Headers-1"></span><h4 class="subsection">26.4.4 Once-Only Headers</h4>
64<span id="index-repeated-inclusion"></span>
65<span id="index-including-just-once"></span>
66<span id="index-wrapper-_0023ifndef"></span>
67
68<p>If a header file happens to be included twice, the compiler will process
69its contents twice. This is very likely to cause an error, e.g. when the
70compiler sees the same structure definition twice.
71</p>
72<p>The standard way to prevent this is to enclose the entire real contents
73of the file in a conditional, like this:
74</p>
75<div class="example">
76<pre class="example">/* File foo. */
77#ifndef FILE_FOO_SEEN
78#define FILE_FOO_SEEN
79
80<var>the entire file</var>
81
82#endif /* !FILE_FOO_SEEN */
83</pre></div>
84
85<p>This construct is commonly known as a <em>wrapper #ifndef</em>. When the
86header is included again, the conditional will be false, because
87<code>FILE_FOO_SEEN</code> is defined. Preprocessing skips over the entire
88contents of the file, so that compilation will never &ldquo;see&rdquo; the file
89contents twice in one module.
90</p>
91<p>GCC optimizes this case even further. It remembers when a header file
92has a wrapper <code>#ifndef</code>. If a subsequent <code>#include</code>
93specifies that header, and the macro in the <code>#ifndef</code> is still
94defined, it does not bother to rescan the file at all.
95</p>
96<p>You can put comments in the header file outside the wrapper. They
97do not interfere with this optimization.
98</p>
99<span id="index-controlling-macro"></span>
100<span id="index-guard-macro"></span>
101<p>The macro <code>FILE_FOO_SEEN</code> is called the <em>controlling macro</em>
102or <em>guard macro</em>. In a user header file, the macro name should
103not begin with &lsquo;<samp>_</samp>&rsquo;. In a system header file, it should begin
104with &lsquo;<samp>__</samp>&rsquo; (or &lsquo;<samp>_</samp>&rsquo; followed by an upper-case letter) to avoid
105conflicts with user programs. In any kind of header file, the macro
106name should contain the name of the file and some additional text, to
107avoid conflicts with other header files.
108</p>
109<hr>
110<div class="header">
111<p>
112Next: <a href="Computed-Includes.html" accesskey="n" rel="next">Computed Includes</a>, Previous: <a href="Search-Path.html" accesskey="p" rel="prev">Search Path</a>, Up: <a href="Header-Files.html" accesskey="u" rel="up">Header Files</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Symbol-Index.html" title="Index" rel="index">Index</a>]</p>
113</div>
114
115
116
117</body>
118</html>
Note: See TracBrowser for help on using the repository browser.