Я изучаю стандарт С++ о точном поведении препроцессора (мне нужно реализовать какой-то препроцессор С++). Из того, что я понимаю, должен быть приведен пример, который я составил (чтобы помочь моему пониманию) ниже:
#define dds(x) f(x,
#define f(a,b) a+b
dds(eoe)
su)
Я ожидаю, что первая функция, такая как вызов макроса dds(eoe)
, будет заменена на f(eoe,
(обратите внимание на запятую в заменяющей строке), которая затем рассматривается как f(eoe,su)
при повторном сканировании ввода.
Но тест с VС++ 2010 дал мне это (я сказал VС++ вывести предварительно обработанный файл):
eoe+et_leoe+et_l
su)
Это противоречит интуиции и, очевидно, неверно. Это ошибка с VС++ 2010 или мое непонимание стандарта С++? В частности, неправильно ли вводить запятую в конце строки замены, как я? Мое понимание стандартной грамматики С++ заключается в том, что там разрешен любой preprocessing-token
.
EDIT:
У меня нет GCC или других версий VС++. Может ли кто-нибудь помочь мне проверить эти компиляторы.