Турбо С: руководство пользователя. Часть 2

Турбо С: руководство пользователя. Часть 2 - Стр. 36

Печать PDF
Индекс материала
Турбо С: руководство пользователя. Часть 2
Стр. 2
Стр. 3
Стр. 4
Стр. 5
Стр. 6
Стр. 7
Стр. 8
Стр. 9
Стр. 10
Стр. 11
Стр. 12
Стр. 13
Стр. 14
Стр. 15
Стр. 16
Стр. 17
Стр. 18
Стр. 19
Стр. 20
Стр. 21
Стр. 22
Стр. 23
Стр. 24
Стр. 25
Стр. 26
Стр. 27
Стр. 28
Стр. 29
Стр. 30
Стр. 31
Стр. 32
Стр. 33
Стр. 34
Стр. 35
Стр. 36
Стр. 37
Стр. 38
Стр. 39
Стр. 40
Стр. 41
Стр. 42
Стр. 43
Стр. 44
Стр. 45
Стр. 46
Стр. 47
Стр. 48
Стр. 49
Стр. 50
Стр. 51
Стр. 52
Стр. 53
Стр. 54
Стр. 55
Стр. 56
Все страницы
     директивах #define и #undef:                                               
                                                                                
          _STDC_                                                                
          _FILE_                                                                
          _LINE_                                                                

                         - 293,294 -
                                                                                
          _DATE_                                                                
          _TIME_                                                                
                                                                                
          2. Две лексемы могут быть помещены вместе в макроопределение          
     с разделением их знаками ## (плюс необязательные пробелы с каждой          
     стороны). Препроцессор  удаляет пробелы и ##, а также комбинирует          
     разделенные лексемы.  Это может быть  использовано  для  создания          
     идентификаторов, например, задав:                                          
                                                                                
          #define VAR(i,j)          (i ## j)                                    
                                                                                
     при  VAR(x,6)  обращение  вызовет  подстановку  x6.  Это заменяет          
     иногда употребляемую, но не переносимую запись (i/**/j).                   
                                                                                
          3. Вложенные макросы  в  строке  макроопределения  сработают          
     лишь тогда,   когда сработает сам макрос,  а не при его описании.          
     Это больше касается вложенных макросов #undef.                             
                                                                                
          4. Символ #,  помещаемый перед макроаргументом,  указанном в          
     последовательности, преобразует аргумент в строку. При макроподс-          
     тановке производится замена #
                                                                                
                                                                                
                                                                                
                                                                                

                         - 297,298 -
                                                                                
               Условная компиляция (K&R 12.3)                                   
     -----------------------------------------------------------------          
                                                                                
          Турбо Си поддерживает определение условной компиляции K&R  с          
     помощью замены   соответствующих  строк  на пустые.  Игнорируемые          
     строки начинаются с директив #if,  #ifdef, #ifndef, #else, #elif,          
     и #endif,  также как и все некомпилируемые строки, являющиеся ре-          
     зультатом этих директив. Все директивы условной компиляции должны          
     заканчиваться в  исходной программе или include файле,  в которых          
     они начались.                                                              
                                                                                
          Турбо Си поддерживает также оператор  ANSI  defined(символ).          
     Значение 1 (true)  присваивается,  если символ был предварительно          
     определен (с использованием #define)  и затем не был  отменен  (с          
     использованием undef);     в  противном  случае  присваивается  0          
     (false). Так, директива                                                    
                                                                                
          #if defined(mysym)                                                    
                                                                                
     адекватна директиве                                                        
                                                                                
          #ifdef mysym                                                          
                                                                                
                                                                                
                                                                                
          Преимущество в том,  что можно повторно использовать defined          
     в сложном выражении, стоящем за директивой #if:                            
                                                                                
          #if defined(mysym) || defined(yoursym)                                
                                                                                
          Наконец, Турбо Си (в отличие от ANSI) позволяет использовать          
     оператор sizeof  в выражениях препроцессора.  Так вы можете напи-          
     сать следующее:                                                            
                                                                                
          #if (sizeof(void *) == 2)                                             
          #define SDATA                                                         
          #else                                                                 
          #define LDATA                                                         
          #endif                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                

                         - 299,300 -
                                                                                
               Управление строками (K&R 12.4)                                   
     -----------------------------------------------------------------          
                                                                                
          Турбо Си поддерживает определение #line,  данное в K&R. Рас-          
     ширения макросов в #line такие же, как и в #include.                       
                                                                                
                                                                                
                                                                                
               Директива error (ANSI Си 3.8.5)                                  
     -----------------------------------------------------------------          
                                                                                
          Турбо Си поддерживает директиву #error,  которая упоминается          
     (но не определена в полной мере) в ANSI-стандарте. Ее формат:              
                                                                                
          #error errmsg                                                         
                                                                                
     и вызывает сообщение                                                       
                                                                                
          Fatal: filename line# Error directive: errmsg                         
                                                                                
       (Фатальная ошибка: Имяфайла строка# Ошибка в директиве: errmsg)          
                                                                                
                                                                                
          У  программистов  принято  включать эту директиву в условный          
     препроцессор, что захватывает некоторые  нежелательные  состояния          
     во  время  компиляции.  При благоприятном исходе это состояние не          
     будет true.  В случае, если это состояние true, вы захотите напе-          
     чатать сообщение об ошибке и остановить компиляцию. Вы вставляете          
     директиву #error внутрь условия, для которого true является неже-          
     лательным исходом.  Например,  предполагается,  что #define MYVAL          
     принимает значения либо 0 либо 1. Вы можете тестировать на некор-          
     ректность значение MYVAL, если включите в ваш исходный код следу-          
     ющее условие:                                                              
                                                                                
                                                                                
          #if (MYVAL != 0 && MYVAL != 1)                                        
                                                                                
          #error MYVAL должен быть определен только либо 0 либо 1               
                                                                                
          #endef                                                                
                                                                                
                                                                                
          Препроцессор просматривает текст,  уничтожая комментарии,  а          
     на экран   выводит  оставшийся  текст без просмотра для выявления          
     макросов.                                                                  

                         - 301,302 -