Можете ли вы помочь мне с коротким кодом, который может напечатать сам?

#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 - это иногда называют "строкой"). Здесь нет никакой другой магии.

Другие вопросы по тегам