你能帮我一个可以打印的简短代码吗?

时间:2011-11-20 09:40:23

标签: c macros

#define q(k)main(){return!puts(#k"\nq("#k")");}
q(#define q(k)main(){return!puts(#k"\nq("#k")");})

这段代码可以在屏幕上自行打印,但是我很难阅读它,特别是那两个#K,它是如何工作的?我知道#define q(k)2 * k是如何工作的,但我真的不知道这个代码。请帮我分析一下!谢谢!

1 个答案:

答案 0 :(得分:9)

简化调用并使用编译器的预处理器来查看正在发生的事情:

#define q(k)main(){puts(#k"hello("#k")");}
q(argument)

在其上运行gcc -E会给您:

main(){puts("argument""hello(""argument"")");}

正如您所看到的,会发生的事情是q宏的参数被转换为字符串(因为它被用作#k - 这有时被称为“字符串化”)。这里没有其他魔法。