Недопустимые макросы потока символов - PullRequest
0 голосов
/ 15 октября 2011

Следующий макрос препроцессора:

#define _VARIANT_BOOL /##/

на самом деле недопустим C ;грубо говоря, причина в том, что препроцессор определен как работающий с потоком токенов, тогда как вышеизложенное предполагает, что он работает с потоком символов.

С другой стороны, к сожалению, вышеупомянутое действительно происходит вЗаголовочный файл Microsoft, так что я все равно должен с ним справиться.(Я работаю над реализацией препроцессора.)

В каких других случаях люди встречались в дикой природе, будь то устаревший код, какой бы старый он ни был, пока этот код еще используется, макросов препроцессора, которыена самом деле не действителен, но работает в любом случае, потому что они написаны в компиляторах, использующих символьно-ориентированную реализацию препроцессора?

(Обоснование: я пытаюсь заранее понять, сколько особых случаев у меня будетвзломать, если я напишу правильную чистую, соответствующую стандарту токен-ориентированную реализацию.)

1 Ответ

0 голосов
/ 17 октября 2011

Соответствующая часть стандарта (§6.10.3.3 The ## operator) гласит:

Если результат не является допустимым токеном предварительной обработки, поведение не определено.

Это означает, что ваш препроцессор может делать все, что ему нравится, и при этом соответствовать стандарту, включая эмуляцию обычного поведения.

Я думаю, что вы все еще можете иметь реализацию на основе токенов и поддерживать это поведение,указав, что когда результат оператора ## не является допустимым токеном предварительной обработки, результатом является то, что два операнда-токена остаются неизменными.Возможно, вы также захотите, чтобы ваш препроцессор выдал предупреждение о неверном коде.

...