19 Preprocessing directives [cpp]

19.3 Macro replacement [cpp.replace]

19.3.1 Argument substitution [cpp.subst]

После того, как аргументы для вызова макроса, подобного функции, были идентифицированы, происходит подстановка аргументов. Параметр в списке замены, если не предшествуют # или ## предварительной обработкой маркера или сопровождаемое ## предварительная обработка маркера (см ниже), заменяются на соответствующий аргумент после того, как все содержащиеся в нем макросы были расширены. Перед заменой токены предварительной обработки каждого аргумента полностью заменяются макросом, как если бы они сформировали остальную часть файла предварительной обработки; другие токены предварительной обработки недоступны.

Идентификатор, __VA_­ARGS__ который встречается в списке замены, должен рассматриваться, как если бы он был параметром, а переменные аргументы должны формировать токены предварительной обработки, используемые для его замены.