Можете ли вы помочь мне с коротким кодом, который может напечатать сам?
#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 ответ
Решение
Упростите вызов и используйте препроцессор вашего компилятора, чтобы увидеть, что происходит:
#define q(k)main(){puts(#k"hello("#k")");}
q(argument)
Бег gcc -E
на что дает вам:
main(){puts("argument""hello(""argument"")");}
Как вы можете видеть, происходит то, что аргумент q
макрос превращается в строку (потому что используется как #k
- это иногда называют "строкой"). Здесь нет никакой другой магии.