19 Preprocessing directives [cpp]

19.3 Macro replacement [cpp.replace]

19.3.2 The # operator [cpp.stringize]

За каждым # токеном предварительной обработки в списке замены для функционально-подобного макроса должен следовать параметр в качестве следующего токена предварительной обработки в списке замены.

A character string literal - это string-literalбез префикса. Если в списке замены параметру непосредственно предшествует # токен предварительной обработки, оба они заменяются токеном предварительной обработки литерала из односимвольной строки, который содержит написание последовательности токенов предварительной обработки для соответствующего аргумента. Каждое появление пробела между токенами предварительной обработки аргумента становится одним пробелом в литерале строки символов. Пробел перед первым токеном предварительной обработки и после последнего токена предварительной обработки, составляющего аргумент, удаляется. В противном случае, первоначальное написание каждого Preprocessing лексемы аргумента сохраняется в строке литеры, для специальной обработки , за исключением производства написания строк и символьных литералы: а \ символ вставляется перед каждым " и \ характером литеры или строкового литерала (включая" символы- разделители ). Если полученная замена не является допустимым символьным строковым литералом, поведение не определено. Литерал символьной строки, соответствующий пустому аргументу, равен "". Порядок оценки # и ## операторов не определен.