summaryrefslogtreecommitdiff
path: root/share/doc/cpp/Concatenation.html
diff options
context:
space:
mode:
Diffstat (limited to 'share/doc/cpp/Concatenation.html')
-rw-r--r--share/doc/cpp/Concatenation.html168
1 files changed, 168 insertions, 0 deletions
diff --git a/share/doc/cpp/Concatenation.html b/share/doc/cpp/Concatenation.html
new file mode 100644
index 0000000..625aff7
--- /dev/null
+++ b/share/doc/cpp/Concatenation.html
@@ -0,0 +1,168 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<!-- Copyright (C) 1987-2023 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.1, http://www.gnu.org/software/texinfo/ -->
+<head>
+<title>The C Preprocessor: Concatenation</title>
+
+<meta name="description" content="The C Preprocessor: Concatenation">
+<meta name="keywords" content="The C Preprocessor: Concatenation">
+<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="Variadic-Macros.html#Variadic-Macros" rel="next" title="Variadic Macros">
+<link href="Stringizing.html#Stringizing" rel="previous" title="Stringizing">
+<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="Concatenation"></a>
+<div class="header">
+<p>
+Next: <a href="Variadic-Macros.html#Variadic-Macros" accesskey="n" rel="next">Variadic Macros</a>, Previous: <a href="Stringizing.html#Stringizing" accesskey="p" rel="previous">Stringizing</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="Concatenation-1"></a>
+<h3 class="section">3.5 Concatenation</h3>
+<a name="index-concatenation"></a>
+<a name="index-token-pasting"></a>
+<a name="index-token-concatenation"></a>
+<a name="index-_0023_0023-operator"></a>
+
+<p>It is often useful to merge two tokens into one while expanding macros.
+This is called <em>token pasting</em> or <em>token concatenation</em>. The
+&lsquo;<samp>##</samp>&rsquo; preprocessing operator performs token pasting. When a macro
+is expanded, the two tokens on either side of each &lsquo;<samp>##</samp>&rsquo; operator
+are combined into a single token, which then replaces the &lsquo;<samp>##</samp>&rsquo; 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&rsquo;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>
+<p>However, two tokens that don&rsquo;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 &lsquo;<samp>##</samp>&rsquo;
+in complex macros. If you get this warning, it is likely that you can
+simply remove the &lsquo;<samp>##</samp>&rsquo;.
+</p>
+<p>Both the tokens combined by &lsquo;<samp>##</samp>&rsquo; 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 &lsquo;<samp>##</samp>&rsquo; is a
+parameter name, it is replaced by its actual argument before &lsquo;<samp>##</samp>&rsquo;
+executes. As with stringizing, the actual argument is not
+macro-expanded first. If the argument is empty, that &lsquo;<samp>##</samp>&rsquo; has no
+effect.
+</p>
+<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 &lsquo;<samp>/</samp>&rsquo; and &lsquo;<samp>*</samp>&rsquo;. You can put as much
+whitespace between &lsquo;<samp>##</samp>&rsquo; 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 &lsquo;<samp>##</samp>&rsquo; appears at either
+end of a macro body.
+</p>
+<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:
+</p>
+<div class="smallexample">
+<pre class="smallexample">struct command
+{
+ char *name;
+ void (*function) (void);
+};
+</pre><pre class="smallexample">
+</pre><pre class="smallexample">struct command commands[] =
+{
+ { &quot;quit&quot;, quit_command },
+ { &quot;help&quot;, help_command },
+ &hellip;
+};
+</pre></div>
+
+<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 stringizing, and the function name by
+concatenating the argument with &lsquo;<samp>_command</samp>&rsquo;. Here is how it is done:
+</p>
+<div class="smallexample">
+<pre class="smallexample">#define COMMAND(NAME) { #NAME, NAME ## _command }
+
+struct command commands[] =
+{
+ COMMAND (quit),
+ COMMAND (help),
+ &hellip;
+};
+</pre></div>
+
+<hr>
+<div class="header">
+<p>
+Next: <a href="Variadic-Macros.html#Variadic-Macros" accesskey="n" rel="next">Variadic Macros</a>, Previous: <a href="Stringizing.html#Stringizing" accesskey="p" rel="previous">Stringizing</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>