开发者

C preprocessor # and ## operators

开发者 https://www.devze.com 2023-03-18 20:24 出处:网络
The C99 standard document has the following example in the section related to the ## preprocessing operator:

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.

0

精彩评论

暂无评论...
验证码 换一张
取 消