Можете ли вы помочь мне с коротким кодом, который может напечатать сам? - PullRequest
5 голосов
/ 20 ноября 2011
#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 Ответ

9 голосов
/ 20 ноября 2011

Упростите вызов и используйте препроцессор вашего компилятора, чтобы увидеть, что происходит:

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

Запуск gcc -E, который дает вам:

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

Как видите,что происходит, так это то, что аргумент макроса q преобразуется в строку (потому что используется как #k - это иногда называют "stringification").Здесь нет никакой другой магии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...