Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.14.14.164] |
|
Сообщ.
#1
,
|
|
|
Как препроцессор с помощью условной компиляции даёт понять компилятору, что часть программы необходимо скомпилировать или пропустить?
|
Сообщ.
#2
,
|
|
|
Путем выкидывания/включения части кода помеченной директивами препроцессора.
Типа написал ты там #if defined __WIN32 ololo #else trololo #endif Перед компиляцией проходит такой препроцессор и смотрит - ага макрос __WIN32 определен, значит вместо этого блока всего в файл на выходе записать строку ololo. А уж потом этот файл компилятор начинает обрабатывать. В компиляторе можно включить настройку - генерировать файл препроцессора, чтобы посмотреть что сгенерировал препроцессор. Т.е. по факту что будет компилироваться. По сути препроцессор - это что то типа Найти и заменить. |
Сообщ.
#3
,
|
|
|
А если не генерировать, то будет создан этакий "файл" в памяти?
|
Сообщ.
#4
,
|
|
|
Цитата Славян @ Нет, тогда он не генерится в памяти целиком, а прямо в ходе генерации передаётся на компиляцию. В первых компиляторах файл в любом случае писался на диск, но для человека он немного по-другому оформлялся, из него выбрасывалась информация о номерах строк и т.п., нужная для сообщений об ошибках на последующих этапах компиляции.то будет создан этакий "файл" в памяти? Wound немного неточно написал, хотя суть от этого не меняется. Препроцессор не вставляет тот или иной текст а свой результат. Он просто читает входной файл(файлы) строка за строкой. Встретив директиву #include начинает читать указанный в ней файл, когда тот закончится продолжает читать текущий. Встретив любой #if, проверяет условие и если оно не выполняется начинает выбрасывать все строки, пока не встретит #endif или #else. Если же условие выполнено, то строки после #if передаются на выход. В таком случае строки пропускаются после #else. Перед проверкой сток на предмет директив препроцессор убирает комментарии, а в передаваемых на выход строках выполняет подстановку макросов. Первые варианты препроцессора С умещались в пару сотен строк текста. Сейчас препроцессору добавили ещё несколько функций и ему ещё риходится производить предварительный разбор текста. |