C препроцессор # и ## операторы - PullRequest
16 голосов
/ 06 июля 2011

Стандартный документ C99 содержит следующий пример в разделе, связанном с оператором предварительной обработки ##:

В следующем фрагменте:

#define hash_hash # ## #
#define mkstr(a) # a
#define in_between(a) mkstr(a)
#define join(c, d) in_between(c hash_hash d)

char p[] = join(x, y); // equivalent to
                       // char p[] = "x ## y";

Расширение производит на разных этапах:

join(x, y)
in_between(x hash_hash y)
in_between(x ## y)
mkstr(x ## y)
"x ## y"

Другими словами, расширение hash_hash создает новый токен, состоящий из двух смежных острых знаков, но этот новый токен не является оператором ##.

Я не понимаю, почему подстановка hash_hash производит ##, а не "##" или "#" "#".Какую роль играют одиночные хеши до и после исполнения двойного хеша?

Любые ответы с благодарностью.

1 Ответ

21 голосов
/ 06 июля 2011

## в # ## # действует как escape-последовательность в этом выражении. Он соединяет крайний левый и правый #, чтобы в итоге получить токен ##. Простое определение макроса как ## приведет к ошибке, поскольку оператор конкатенации ожидает два операнда.

...