Возникла необходимость генерировать некие комментарии еще на стадии препроцессинга файлов. Что забавно, так то что gcc и cl дали совершенно разные результаты. Не могу сообразить каким макаром этот вопрос решить универсально.
Пример кода:
#define COM(x) /x
void foo () {
COM(/) this is test
}
Ожидаемый результат после препроцессора:
void foo () {
// this is test
}
Что получаем в gcc -E:
void foo () {
/ / this is test
}
Что получаем в cl -E:
void foo () {
}
Создается впечатление что кто-то из них гонит... Вопросы — кто, и есть ли возможность решить данную задачу универсально?
Здравствуйте, Nose, Вы писали:
N>Здравствуйте, shoorik, Вы писали:
S>>Создается впечатление что кто-то из них гонит... Вопросы — кто, и есть ли возможность решить данную задачу универсально?
N>ИМХО, cl прав, т.к. комментарии удаляются из кода на стадии препроцессинга
Дело не в этом, возможно просто в коде не видно — gcc вставляет между слешами " " пробел зачем-то, то что он после этого эту строку не удаляет — это понятно...
Здравствуйте, shoorik, Вы писали:
S>Дело не в этом, возможно просто в коде не видно — gcc вставляет между слешами " " пробел зачем-то, то что он после этого эту строку не удаляет — это понятно...
Покурил немного стандарт.
С++ — ным препроцессором не получится сделать макрос, т.к комментарии убираются на третьей фазе, а макросы раскрываются на четвертой
после чего получаем комментарий, который не является preprocessing token -- неопределенное поведение
Здравствуйте, Nose, Вы писали:
N>Покурил немного стандарт. N>С++ — ным препроцессором не получится сделать макрос, т.к комментарии убираются на третьей фазе, а макросы раскрываются на четвертой N>после чего получаем комментарий, который не является preprocessing token -- неопределенное поведение
N>Правда в теме "С".. тут ниче не могу сказать
Нужно и для С и для С++ — в проекте и то и другое.
Тоесть задача фактически не решается?
Здравствуйте, shoorik, Вы писали:
S>Нужно и для С и для С++ — в проекте и то и другое. S>Тоесть задача фактически не решается?
Похоже на то, суди сам
2.1 Phases of translation [lex.phases]
1 The precedence among the syntax rules of translation is specified by the following phases.13)
...
3 The source file is decomposed into preprocessing tokens (2.4) and sequences of white-space characters
(including comments). A source file shall not end in a partial preprocessing token or partial comment14).
Each comment is replaced by one space character. New-line characters are retained. Whether
each nonempty sequence of white-space characters other than new-line is retained or replaced by one
space character is implementation-defined. The process of dividing a source file’s characters into preprocessing
tokens is context-dependent. [Example: see the handling of < within a #include preprocessing
directive. ]
4 Preprocessing directives are executed and macro invocations are expanded. If a character sequence that
matches the syntax of a universal-character-name is produced by token concatenation (16.3.3), the
behavior is undefined. A #include preprocessing directive causes the named header or source file to
be processed from phase 1 through phase 4, recursively.
Re: Создание комментариев через препроцессор C
От:
Аноним
Дата:
06.09.06 04:24
Оценка:
Здравствуйте, shoorik, Вы писали:
А если так:
#define COM /##/
void foo () {
COM: this is test
}
Re[5]: Создание комментариев через препроцессор C
От:
Аноним
Дата:
06.09.06 22:13
Оценка:
S>Нужно и для С и для С++ — в проекте и то и другое. S>Тоесть задача фактически не решается?
Когда программисту делать нечего, он начинает извращаться...
После того как препроцессор закончит работу, в translation-unit'е не должно быть никаких комментариев.
Здравствуйте, shoorik, Вы писали:
S>Нужно и для С и для С++ — в проекте и то и другое. S>Тоесть задача фактически не решается?
Можно попробовать использовать внешние макропроцесоры, к примеру M4
сначала обрабатывать файлы им, а затем уже передавать препроцессору/компилятору С/C++
т.е. добавится еще одна стадия в сборке:
.pcpp -> .cpp -> .o