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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With