610_________________________________________Глава Д

ется некоторое выражение. Например, если описанный выше макрос CIRC, вычис-
ляющий площадь круга, вызвать следующим образом:                  

S = CIRC(a++)                                                      

предполагая рассчитать площадь и затем операцией постфиксного инкремента
раздел 11.7.2) увеличить радиус на 1, то макрос будет расширен так:      

S = (3.14159 * (а++) * (а++));                                     

При этом площадь будет вычислена верно, но постфиксный инкремент вычис-
лится два раза. В результате значение радиуса а будет увеличено не на 1, а
Если же это макрос вызвать следующим образом:                   

S = CIRC(++a)                                                      

предполагая увеличить радиус на 1 и вычислить площадь круга с таким увел
ным радиусом, то макрос будет расширен так:                          

S = (3.14159 * (++а) * (++а));                                     

При этом площадь будет определена неверно, так как в процессе вычисл
радиус будет увеличен дважды и выражение окажется эквивалентным следуюц

S = (3.14159 * (а + 1) * (а + 2));                                 

Всех этих побочных эффектов не будет, если вместо макроса использовать
санную выше функцию circ.                                          

При выборе реализации вычислений функцией или макросом надо обес
вать компромисс между скоростью вычислений и затратами памяти. Для не
ших функций, возможно, наилучшим решением является применение встра
мых функций (inline — см. раздел 11.5.6). Для них проблемы оптимальной ре
зации решает компилятор, и делает это он, вероятно, не хуже нас с вами. 

Хороший стиль программирования —————————————————————

Избегайте применения сложных макросов с параметрами, так как они могут привод
нежелательным побочным эффектам. Вместо подобных макросов лучше использ
встраиваемые функции inline.                                             

11.2.2.3 Директива #undef                                     

Определения символических констант и макросов могут быть аннулиров
при помощи директивы препроцессора #undef, имеющей вид:           

ttundef идентификатор                                             

Директива отменяет определение символической константы или макро
указанным идентификатором. Таким образом, область действия символиче
константы или макроса начинается с места их определения и заканчиваетс
ным их аннулированием директивой #undef или концом файла. После аннул
вания соответствующий идентификатор может быть снова использован в дире
ве #define.                                                         ^^B

Например, возможен следующий код:                            

ttdefine MyConst 128                                               

// Здесь константа MyConst равна 128                              

ftundef MyConst                                                    
// Здесь константу MyConst использовать нельзя                    

#define MyConst 64                                               
// Здесь константа MyConst равна 64                              