Создание комментариев через препроцессор C
От: shoorik  
Дата: 05.09.06 10:03
Оценка:
Возникла необходимость генерировать некие комментарии еще на стадии препроцессинга файлов. Что забавно, так то что 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 () {

}


Создается впечатление что кто-то из них гонит... Вопросы — кто, и есть ли возможность решить данную задачу универсально?
Re: Создание комментариев через препроцессор C
От: Nose Россия  
Дата: 05.09.06 10:09
Оценка:
Здравствуйте, shoorik, Вы писали:


S>Создается впечатление что кто-то из них гонит... Вопросы — кто, и есть ли возможность решить данную задачу универсально?


ИМХО, cl прав, т.к. комментарии удаляются из кода на стадии препроцессинга
Re[2]: Создание комментариев через препроцессор C
От: shoorik  
Дата: 05.09.06 10:11
Оценка:
Здравствуйте, Nose, Вы писали:

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



S>>Создается впечатление что кто-то из них гонит... Вопросы — кто, и есть ли возможность решить данную задачу универсально?


N>ИМХО, cl прав, т.к. комментарии удаляются из кода на стадии препроцессинга


Дело не в этом, возможно просто в коде не видно — gcc вставляет между слешами " " пробел зачем-то, то что он после этого эту строку не удаляет — это понятно...
Re[3]: Создание комментариев через препроцессор C
От: Nose Россия  
Дата: 05.09.06 10:23
Оценка:
Здравствуйте, shoorik, Вы писали:

S>Дело не в этом, возможно просто в коде не видно — gcc вставляет между слешами " " пробел зачем-то, то что он после этого эту строку не удаляет — это понятно...


Покурил немного стандарт.
С++ — ным препроцессором не получится сделать макрос, т.к комментарии убираются на третьей фазе, а макросы раскрываются на четвертой
после чего получаем комментарий, который не является preprocessing token -- неопределенное поведение

Правда в теме "С".. тут ниче не могу сказать
Re[4]: Создание комментариев через препроцессор C
От: Nose Россия  
Дата: 05.09.06 10:25
Оценка:
Здравствуйте, Nose, Вы писали:

N>С++ — ным препроцессором не получится сделать макрос,


тьфу, опечатался, комментарий конечно
Re[4]: Создание комментариев через препроцессор C
От: shoorik  
Дата: 05.09.06 10:27
Оценка:
Здравствуйте, Nose, Вы писали:

N>Покурил немного стандарт.

N>С++ — ным препроцессором не получится сделать макрос, т.к комментарии убираются на третьей фазе, а макросы раскрываются на четвертой
N>после чего получаем комментарий, который не является preprocessing token -- неопределенное поведение

N>Правда в теме "С".. тут ниче не могу сказать


Нужно и для С и для С++ — в проекте и то и другое.
Тоесть задача фактически не решается?
Re[5]: Создание комментариев через препроцессор C
От: Nose Россия  
Дата: 05.09.06 10:38
Оценка:
Здравствуйте, 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'е не должно быть никаких комментариев.
Re[2]: Создание комментариев через препроцессор C
От: shoorik  
Дата: 07.09.06 09:16
Оценка:
Здравствуйте, Аноним, Вы писали:

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

А>А если так:
А>
А>#define COM    /##/
А>void foo () {
А>    COM: this is test
А>}
А>


Тот же результат с cl.exe а вот gcc ругается:

void foo () {
t.cpp:3:5: pasting "/" and "/" does not give a valid preprocessing token
    / /: this is test
}


В общем-то смысл мне понятен... Спасибо всем, мы пойдем другим путем..
Re[5]: Создание комментариев через препроцессор C
От: silamantex Южная Корея  
Дата: 13.09.06 04:10
Оценка:
Здравствуйте, shoorik, Вы писали:

S>Нужно и для С и для С++ — в проекте и то и другое.

S>Тоесть задача фактически не решается?
Можно попробовать использовать внешние макропроцесоры, к примеру M4

сначала обрабатывать файлы им, а затем уже передавать препроцессору/компилятору С/C++

т.е. добавится еще одна стадия в сборке:
.pcpp -> .cpp -> .o
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.