#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是如何工作的,但我真的不知道这个代码。请帮我分析一下!谢谢!
答案 0 :(得分:9)
简化调用并使用编译器的预处理器来查看正在发生的事情:
#define q(k)main(){puts(#k"hello("#k")");}
q(argument)
在其上运行gcc -E
会给您:
main(){puts("argument""hello(""argument"")");}
正如您所看到的,会发生的事情是q
宏的参数被转换为字符串(因为它被用作#k
- 这有时被称为“字符串化”)。这里没有其他魔法。