вопрос:
что сделает первее pp msvc — раскроет макрос __drv_nop или выполнит склеивание? По стандарту, должно производиться склеивание. Склеивание выдает токен (__drv_nop который является некорректным.
Здравствуйте, Аноним, Вы писали:
А>дано: А>#define __drv_out(annotes) __post __$drv_group(##__drv_nop(annotes)) А>макрос используется например из етого места А>вопрос: А>что сделает первее pp msvc — раскроет макрос __drv_nop или выполнит склеивание? По стандарту, должно производиться склеивание. Склеивание выдает токен (__drv_nop который является некорректным.
Из примера видно что вы делаете склейку со скобкой, а это не pp token. Результат — UB.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Из примера видно что вы делаете склейку со скобкой, а это не pp token. Результат — UB.
))). Это мне и так понятно. Склейку делает pp msvc в дефолтовом режиме(в режиме STDC — Za он тоже спотыкается, даже не доходя до склейки — на $ ). Мне нужно узнать какие шаги препроцессор выполняет. Это нужно чтобы впихнуть в свой pp поддержку етой "фичи" msvc.
Здравствуйте, J0nny, Вы писали:
V>>Из примера видно что вы делаете склейку со скобкой, а это не pp token. Результат — UB. J>))). Это мне и так понятно. Склейку делает pp msvc в дефолтовом режиме(в режиме STDC — Za он тоже спотыкается, даже не доходя до склейки — на $ ). Мне нужно узнать какие шаги препроцессор выполняет. Это нужно чтобы впихнуть в свой pp поддержку етой "фичи" msvc.
Если вопрос ни в "как написать", а в "что делает здесь препроцессор", то только тестами и можно. На моей памяти спец символы у msvc не являются полноценными pp токенами, т.е. их можно в некоторых случая подставлять как обычные. К примеру, у меня получилось запихнуть /* и */ в макросы и пользоваться макросами для комментирования кода. Похожий пример есть здесь
. Но повторяю, это всё от лешего, ни к чему хорошому знания деталей говно-парсера не приведёт, только к новым неприятностям на свою Ж. Но если вам нравятся бага-квесты, то вперёд.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, J0nny, Вы писали:
V>>>Из примера видно что вы делаете склейку со скобкой, а это не pp token. Результат — UB. J>>))). Это мне и так понятно. Склейку делает pp msvc в дефолтовом режиме(в режиме STDC — Za он тоже спотыкается, даже не доходя до склейки — на $ ). Мне нужно узнать какие шаги препроцессор выполняет. Это нужно чтобы впихнуть в свой pp поддержку етой "фичи" msvc. V>Если вопрос ни в "как написать", а в "что делает здесь препроцессор", то только тестами и можно. На моей памяти спец символы у msvc не являются полноценными pp токенами, т.е. их можно в некоторых случая подставлять как обычные. К примеру, у меня получилось запихнуть /* и */ в макросы и пользоваться макросами для комментирования кода. Похожий пример есть здесь
. Но повторяю, это всё от лешего, ни к чему хорошому знания деталей говно-парсера не приведёт, только к новым неприятностям на свою Ж. Но если вам нравятся бага-квесты, то вперёд.
Спасибо за ответ. Да, выгоднее не реализовать это поведение, так как в заголовочных файлах от мс встречается довольно редко(drvspecs.h из psdk как исключение). По поводу склеивания знаков комментирования /*##*/ и /##/, которое позволяет сделать pp msvc в родном для себя режиме.
Наверное, pp msvc нарушает шаги трансляции исходного кода. Так как в фазе 3 комментарии должны быть замещены пробелом(whitespace). А макроподстановки выполняются только на шаге 4, где на вход принимаются исключительно токены препроцессора.
То есть // на шаге 4 не должно восприниматься как начало комментария, т.к. комментариев там уже не должно быть.