Re[4]: нестандартное поведение препроцессора msvc
От: J0nny  
Дата: 25.01.11 05:06
Оценка:
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, J0nny, Вы писали:


V>>>Из примера видно что вы делаете склейку со скобкой, а это не pp token. Результат — UB.

J>>))). Это мне и так понятно. Склейку делает pp msvc в дефолтовом режиме(в режиме STDC — Za он тоже спотыкается, даже не доходя до склейки — на $ ). Мне нужно узнать какие шаги препроцессор выполняет. Это нужно чтобы впихнуть в свой pp поддержку етой "фичи" msvc.
V>Если вопрос ни в "как написать", а в "что делает здесь препроцессор", то только тестами и можно. На моей памяти спец символы у msvc не являются полноценными pp токенами, т.е. их можно в некоторых случая подставлять как обычные. К примеру, у меня получилось запихнуть /* и */ в макросы и пользоваться макросами для комментирования кода. Похожий пример есть здесь
Автор: Vain
Дата: 08.06.06
. Но повторяю, это всё от лешего, ни к чему хорошому знания деталей говно-парсера не приведёт, только к новым неприятностям на свою Ж. Но если вам нравятся бага-квесты, то вперёд.


Спасибо за ответ. Да, выгоднее не реализовать это поведение, так как в заголовочных файлах от мс встречается довольно редко(drvspecs.h из psdk как исключение). По поводу склеивания знаков комментирования /*##*/ и /##/, которое позволяет сделать pp msvc в родном для себя режиме.
Наверное, pp msvc нарушает шаги трансляции исходного кода. Так как в фазе 3 комментарии должны быть замещены пробелом(whitespace). А макроподстановки выполняются только на шаге 4, где на вход принимаются исключительно токены препроцессора.
То есть // на шаге 4 не должно восприниматься как начало комментария, т.к. комментариев там уже не должно быть.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.