Помещайте тело макроса и его аргументы в круглые скобки
Это правило одно из основных, но я обнаружил, что множество людей, пользующихся Си ежедневно, его забыли. Вот классическая задача:
#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))