Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C preprocessor # and ## operators

The C99 standard document has the following example in the section related to the ## preprocessing operator:

In the following fragment:

#define hash_hash # ## #
#define mkstr(a) # a
#define in_between(a) mkstr(a)
#define join(c, d) in_between(c hash_hash d)

char p[] = join(x, y); // equivalent to
                       // char p[] = "x ## y";

The expansion produces, at various stages:

join(x, y)
in_between(x hash_hash y)
in_between(x ## y)
mkstr(x ## y)
"x ## y"

In other words, expanding hash_hash produces a new token, consisting of two adjacent sharp signs, but this new token is not the ## operator.

I don't understand why the substitution of hash_hash produces ## and not "##" or "#""#". What role are the single hashes before and after the double hash playing?

Any responses greatly appreciated.

like image 740
deStrangis Avatar asked Jul 06 '11 10:07

deStrangis


1 Answers

The ## in # ## # acts like an escape sequence in this expression. It concatenates the leftmost and the rightmost # to finally produce the token ##. Simply defining the macro as ## would cause an error since the concatenation operator expects two operands.

like image 139
Blagovest Buyukliev Avatar answered Oct 18 '22 17:10

Blagovest Buyukliev