NAME
__CONCAT,
__STRING —
argument substitution
SYNOPSIS
#include <sys/cdefs.h>
xy
__CONCAT(
x,
y);
const char *
__STRING(
x);
DESCRIPTION
The
__CONCAT macro makes use of the
cpp(1) preprocessor to concatenate
two tokens. When the macro is expanded,
x and
y are combined into a single token, provided that the
result forms a valid token; two tokens that together do not form a valid token
can not be concatenated. This is known as “token concatenation” or
“token pasting”.
The
__STRING() macro uses the conventional ‘#’
preprocessing operator to replace the argument
x with a
string literal. This is also known as “stringification”.
EXAMPLES
The following two
printf(3) calls
produce the same output:
#define Net 0x01
#define BSD 0x02
#define NetBSD "NetBSD"
(void)printf("%s\n", __CONCAT(Net, BSD));
(void)printf("%s%s\n", __STRING(Net), __STRING(BSD));
SEE ALSO
cpp(1),
cdefs(3)
HISTORY
The
__CONCAT() and
__STRING() macros first
appeared in
NetBSD 1.3.
CAVEATS
Many small details direct the proper use of the macros. For example, while all
leading and trailing whitespace is ignored when
__STRING()
is used, it is undefined whether
cpp(1) puts white space between the
tokens when
__CONCAT() is used. It can be also noted that
the C preprocessor converts all comments to whitespace before any macros are
even considered. The use of either macro is discouraged in complex constructs.
Use of this macro is non-portable; this is part of the implementation namespace
and should only be used in
NetBSD code.