13. Почему в макросах, сделанных «настоящими» программистами, так много круглых скобок?
Автор ARV
18.12.2009 г.
Опытные программисты помнят, что макрос - это всего лишь текстовая автоподстановка, никак не контролируемая ни компилятором, ни чем-то еще. Поэтому наличие скобок даже там, где с первого взгляда они совершенно бессмысленны, позволяет избежать массы проблем. Рассмотрим простой макрос:
#define sq(x) x*x
Задумка была такова: получить квадрат значения х. А теперь рассмотрим, что получится при использовании этого макроса в разных случаях:
Написано
Реально компилируется
Соответствует задуманному?
var = sq(3);
var = 3*3;
Да
var = sq(tmp + 1);
var = tmp + 1 * tmp + 1;
Нет
var = 100 / sq(3);
var = 100 / 3 * 3;
Нет
Если бы макрос был записан с «лишними» скобками, то результат был бы совсем иным:
#define sq(x) ((x)*(x))
Написано
Реально компилируется
Соответствует задуманному?
var = sq(3);
var = ((3)*(3));
Да
var = sq(tmp + 1);
var = ((tmp + 1) * (tmp + 1));
Да
var = 100 / sq(3);
var = 100 / ((3) * (3));
Да
Вывод: в определениях макросов скобки лишними не бывают!