hc
2023-05-26 a23f51ed7a39e452c1037343a84d7db1ca2c5bd7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
<!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: Stringification</title>
 
<meta name="description" content="The C Preprocessor: Stringification">
<meta name="keywords" content="The C Preprocessor: Stringification">
<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="Macros.html#Macros" rel="up" title="Macros">
<link href="Concatenation.html#Concatenation" rel="next" title="Concatenation">
<link href="Macro-Arguments.html#Macro-Arguments" rel="prev" title="Macro Arguments">
<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="Stringification"></a>
<div class="header">
<p>
Next: <a href="Concatenation.html#Concatenation" accesskey="n" rel="next">Concatenation</a>, Previous: <a href="Macro-Arguments.html#Macro-Arguments" accesskey="p" rel="prev">Macro Arguments</a>, Up: <a href="Macros.html#Macros" accesskey="u" rel="up">Macros</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="Stringification-1"></a>
<h3 class="section">3.4 Stringification</h3>
<a name="index-stringification"></a>
<a name="index-_0023-operator"></a>
 
<p>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 &lsquo;<samp>#</samp>&rsquo; preprocessing operator instead.  When a macro
parameter is used with a leading &lsquo;<samp>#</samp>&rsquo;, 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 <em>stringification</em>.
</p>
<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>
<p>Here is an example of a macro definition that uses stringification:
</p>
<div class="smallexample">
<pre class="smallexample">#define WARN_IF(EXP) \
do { if (EXP) \
        fprintf (stderr, &quot;Warning: &quot; #EXP &quot;\n&quot;); } \
while (0)
WARN_IF (x == 0);
     &rarr; do { if (x == 0)
           fprintf (stderr, &quot;Warning: &quot; &quot;x == 0&quot; &quot;\n&quot;); } while (0);
</pre></div>
 
<p>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>
<p>The <code>do</code> and <code>while (0)</code> are a kludge to make it possible to
write <code>WARN_IF (<var>arg</var>);</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>
<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&nbsp;=&nbsp;&quot;foo\n&quot;;<!-- /@w --></code> results in
<tt>&quot;p&nbsp;=&nbsp;\&quot;foo\\n\&quot;;&quot;<!-- /@w --></tt>.  However, backslashes that are not inside string
or character constants are not duplicated: &lsquo;<samp>\n</samp>&rsquo; by itself
stringifies to <tt>&quot;\n&quot;</tt>.
</p>
<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>
<p>There is no way to convert a macro argument into a character constant.
</p>
<p>If you want to stringify the result of expansion of a macro argument,
you have to use two levels of macros.
</p>
<div class="smallexample">
<pre class="smallexample">#define xstr(s) str(s)
#define str(s) #s
#define foo 4
str (foo)
     &rarr; &quot;foo&quot;
xstr (foo)
     &rarr; xstr (4)
     &rarr; str (4)
     &rarr; &quot;4&quot;
</pre></div>
 
<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.
</p>
<hr>
<div class="header">
<p>
Next: <a href="Concatenation.html#Concatenation" accesskey="n" rel="next">Concatenation</a>, Previous: <a href="Macro-Arguments.html#Macro-Arguments" accesskey="p" rel="prev">Macro Arguments</a>, Up: <a href="Macros.html#Macros" accesskey="u" rel="up">Macros</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>