__CONCAT(3) | Library Functions Manual | __CONCAT(3)

# 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.

October 17, 2013 | NetBSD 9.5