На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Условная компиляция
    Как препроцессор с помощью условной компиляции даёт понять компилятору, что часть программы необходимо скомпилировать или пропустить?
      Путем выкидывания/включения части кода помеченной директивами препроцессора.
      Типа написал ты там

      ExpandedWrap disabled
        #if defined __WIN32
        ololo
        #else
        trololo
        #endif

      Перед компиляцией проходит такой препроцессор и смотрит - ага макрос __WIN32 определен, значит вместо этого блока всего в файл на выходе записать строку ololo. А уж потом этот файл компилятор начинает обрабатывать.
      В компиляторе можно включить настройку - генерировать файл препроцессора, чтобы посмотреть что сгенерировал препроцессор. Т.е. по факту что будет компилироваться.
      По сути препроцессор - это что то типа Найти и заменить.
      Сообщение отредактировано: Wound -
        А если не генерировать, то будет создан этакий "файл" в памяти?
          Цитата Славян @
          то будет создан этакий "файл" в памяти?
          Нет, тогда он не генерится в памяти целиком, а прямо в ходе генерации передаётся на компиляцию. В первых компиляторах файл в любом случае писался на диск, но для человека он немного по-другому оформлялся, из него выбрасывалась информация о номерах строк и т.п., нужная для сообщений об ошибках на последующих этапах компиляции.

          Wound немного неточно написал, хотя суть от этого не меняется. Препроцессор не вставляет тот или иной текст а свой результат. Он просто читает входной файл(файлы) строка за строкой. Встретив директиву #include начинает читать указанный в ней файл, когда тот закончится продолжает читать текущий. Встретив любой #if, проверяет условие и если оно не выполняется начинает выбрасывать все строки, пока не встретит #endif или #else. Если же условие выполнено, то строки после #if передаются на выход. В таком случае строки пропускаются после #else.
          Перед проверкой сток на предмет директив препроцессор убирает комментарии, а в передаваемых на выход строках выполняет подстановку макросов.
          Первые варианты препроцессора С умещались в пару сотен строк текста. Сейчас препроцессору добавили ещё несколько функций и ему ещё риходится производить предварительный разбор текста.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0253 ]   [ 16 queries used ]   [ Generated: 19.04.24, 22:01 GMT ]