#和##扩展顺序

rwa*_*ace 7 c macros c-preprocessor

C标准给出了以下示例:

#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";
Run Code Online (Sandbox Code Playgroud)

但它也说'#和##运营商的评估顺序尚未明确.'

为什么hash_hash保证的扩展被解释为应用于#的##运算符,而不是应用于##的#运算符?

Jim*_*ter 3

因为“#”仅在出现在类函数宏中且后跟参数名称时才充当运算符...但 hash_hash 不是类函数宏,并且这些“#”后面不跟参数名称。