Стандартное поведение препроцессора C++ ⇐ C++

Программы на C++. Форум разработчиков
Anonymous
Стандартное поведение препроцессора C++

Сообщение Anonymous »

Я изучаю стандарт 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++ вывести предварительно обработанный файл ):

Код: Выделить всё

eoe+et_leoe+et_l
su)
Это противоречит здравому смыслу и явно неверно. Это ошибка Visual C++ 2010 или мое непонимание стандарта C++? В частности, неправильно ли ставить запятую в конце строки замены, как это сделал я? Насколько я понимаю, в стандартной грамматике C++ разрешены любые токены предварительной обработки.
У меня нет GCC или других версий Visual C++. Как я могу проверить эти компиляторы?

Подробнее здесь: https://stackoverflow.com/questions/225 ... -behaviour

Вернуться в «C++»