Правила программирования на Си и Си++

Помещайте тело макроса и его аргументы в круглые скобки


Это правило одно из основных, но я обнаружил, что множество людей, пользующихся Си ежедневно, его забыли. Вот классическая задача:

#define TWO_K 1024 + 1024

что при использовании в:

* TWO_K

расширяется до:

* 1024 + 1024

вычисляемого как:

(10 * 1024) + 1024

Решаем эту задачу при помощи круглых скобок:

#define TWO_K    (1024 + 1024)

Вот сходная задача в следующем фрагменте кода:

#define SQUARE(x)    (x * x)

Определено:

SQUARE(y + 1);

что расширяется макросом до:

y + 1 * y + 1

и вычисляется как:

y + (1 * y) + 1

И вновь круглые скобки приходят на помощь. Следующее определение:

#define SQUARE(x)    ((x) * (x))

расширяется до:

((y + 1) * (y + 1))



Содержание раздела