нестандартное поведение препроцессора msvc
От: Аноним  
Дата: 23.01.11 11:49
Оценка:
дано:
#define __drv_out(annotes) __post __$drv_group(##__drv_nop(annotes))
макрос используется например из етого места
   SDK v7.0A winnt.h
   typedef
   __drv_sameIRQL
   __drv_functionClass(EXCEPTION_ROUTINE)
   EXCEPTION_DISPOSITION
   NTAPI
   EXCEPTION_ROUTINE (
       __inout struct _EXCEPTION_RECORD *ExceptionRecord,
        __in PVOID EstablisherFrame,
       __inout struct _CONTEXT *ContextRecord,
       __in PVOID DispatcherContext
       );

вопрос:
что сделает первее pp msvc — раскроет макрос __drv_nop или выполнит склеивание? По стандарту, должно производиться склеивание. Склеивание выдает токен (__drv_nop который является некорректным.
Re: нестандартное поведение препроцессора msvc
От: Vain Россия google.ru
Дата: 23.01.11 13:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>дано:

А>#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.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: нестандартное поведение препроцессора msvc
От: J0nny  
Дата: 23.01.11 14:47
Оценка:
Здравствуйте, Vain, Вы писали:

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

))). Это мне и так понятно. Склейку делает pp msvc в дефолтовом режиме(в режиме STDC — Za он тоже спотыкается, даже не доходя до склейки — на $ ). Мне нужно узнать какие шаги препроцессор выполняет. Это нужно чтобы впихнуть в свой pp поддержку етой "фичи" msvc.
Re[3]: нестандартное поведение препроцессора msvc
От: Vain Россия google.ru
Дата: 24.01.11 14:28
Оценка:
Здравствуйте, J0nny, Вы писали:

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

J>))). Это мне и так понятно. Склейку делает pp msvc в дефолтовом режиме(в режиме STDC — Za он тоже спотыкается, даже не доходя до склейки — на $ ). Мне нужно узнать какие шаги препроцессор выполняет. Это нужно чтобы впихнуть в свой pp поддержку етой "фичи" msvc.
Если вопрос ни в "как написать", а в "что делает здесь препроцессор", то только тестами и можно. На моей памяти спец символы у msvc не являются полноценными pp токенами, т.е. их можно в некоторых случая подставлять как обычные. К примеру, у меня получилось запихнуть /* и */ в макросы и пользоваться макросами для комментирования кода. Похожий пример есть здесь
Автор: Vain
Дата: 08.06.06
. Но повторяю, это всё от лешего, ни к чему хорошому знания деталей говно-парсера не приведёт, только к новым неприятностям на свою Ж. Но если вам нравятся бага-квесты, то вперёд.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
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...
Пока на собственное сообщение не было ответов, его можно удалить.