C预处理器:弦乐宏和身份宏[英] C preprocessor: stringize macro and identity macro

本文是小编为大家收集整理的关于C预处理器:弦乐宏和身份宏的处理方法,想解了C预处理器:弦乐宏和身份宏的问题怎么解决?C预处理器:弦乐宏和身份宏问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我想知道该代码输出背后的原因.我无法提出答案.

#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
void main()
{
   printf("%s %s",h(f(1,2)),g(f(1,2)));
}

ps:输出为12 f(1,2).我以为是12 12或f(1,2) f(1,2).

推荐答案

h(f(1,2))

f(1,2)被代替a. a不是#或##运算符的主题,因此将其扩展到12.现在您有g(12)扩展到"12".

g(f(1,2))

f(1,2)被代替a. #运算符应用于a可防止宏扩展,因此结果实际上是"f(1,2)".

其他推荐答案

只需进行替换.

h(f(1, 2)) -> g(12) -> "12"

g(f(1,2)) -> "f(1, 2)"

您还应该查看在这里.

本文地址:https://www.itbaoku.cn/post/359291.html