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