Concatenation - Red Hat ENTERPRISE LINUX 3 - USING CPP Using Instructions

Using cpp, the c preprocessor
Hide thumbs Also See for ENTERPRISE LINUX 3 - USING CPP:
Table of Contents

Advertisement

18
If you want to stringify the result of expansion of a macro argument, you have to use two levels of
macros.
#define xstr(s) str(s)
#define str(s) #s
#define foo 4
str (foo)
==> "foo"
xstr (foo)
==> xstr (4)
==> str (4)
==> "4"
is stringified when it is used in
s
to
, so it is completely macro-expanded before
xstr
Argument Prescan). Therefore, by the time
expanded.

3.5. Concatenation

It is often useful to merge two tokens into one while expanding macros. This is called token pasting
or token concatenation. The
panded, the two tokens on either side of each
replaces the
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
formed by token pasting.
However, two tokens that don't together form a valid token cannot be pasted together. For example,
you cannot concatenate
emits the two tokens. Whether it puts white space between the tokens is undefined. It is common to
find unnecessary uses of
remove the
.
##
Both the tokens combined by
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
by its actual argument before
expanded first. If the argument is empty, that
Keep in mind that the C preprocessor converts comments to whitespace before macros are even con-
sidered. Therefore, you cannot create a comment by concatenating
whitespace between
in arguments that will be concatenated. However, it is an error if
body.
Consider a C program that interprets named commands. There probably needs to be a table of com-
mands, perhaps an array of structures declared as follows:
struct command
{
char *name;
void (*function) (void);
};
, so it is not macro-expanded first. But
str
preprocessing operator performs token pasting. When a macro is ex-
##
and
) into a number. Also, multi-character operators such as
1.5
e3
with
in either order. If you try, the preprocessor issues a warning and
x
+
in complex macros. If you get this warning, it is likely that you can simply
##
could come from the macro body, but you could just as well write
##
executes. As with stringification, the actual argument is not macro-
##
and its operands as you like, including comments, and you can put comments
##
itself is expanded (Refer to Section 3.9.6
xstr
gets to its argument, it has already been macro-
str
operator are combined into a single token, which then
##
##
has no effect.
##
##
Chapter 3. Macros
is an ordinary argument
s
is a parameter name, it is replaced
and
. You can put as much
/
*
appears at either end of a macro
can be
+=

Advertisement

Table of Contents
loading

This manual is also suitable for:

Enterprise linux 3

Table of Contents