Я изучаю стандарт C++, посвященный точному поведению препроцессора (мне нужно реализовать какой-то препроцессор C++). Насколько я понимаю, приведенный ниже пример (чтобы облегчить мое понимание) должен быть действительным:
Код: Выделить всё
#define dds(x) f(x,
#define f(a,b) a+b
dds(eoe)
su)
Я ожидаю, что первый вызов функционального макроса dds(eoe) будет заменен на f(eoe, (обратите внимание на запятую в строке замены), что затем рассматривается как f(eoe,su) при повторном сканировании ввода.
Но тест с Visual C++ 2010 дал мне это (я сказал VC++ вывести предварительно обработанный файл ):
Это противоречит здравому смыслу и явно неверно. Это ошибка Visual C++ 2010 или мое непонимание стандарта C++? В частности, неправильно ли ставить запятую в конце строки замены, как это сделал я? Насколько я понимаю, в стандартной грамматике C++ разрешены любые токены предварительной обработки.
У меня нет GCC или других версий Visual C++. Как я могу проверить эти компиляторы?
Подробнее здесь:
https://stackoverflow.com/questions/225 ... -behaviour