Нужно ли заключать все переменные макроса в скобки?
Здравствуйте.
Я понимаю, что в большинстве случаев это просто необходимо. Однако, может ли кто-нибудь объяснить, зачем использовать скобки в данном примере:
#define bzero(s, n) memset((s), 0, (n))
Чем опасно применение такого варианта?
#define bzero(s, n) memset(s, 0, n)
Ведь запятая имеет самый низкий приоритет выполнения. Следовательно, любые операции, содержащиеся в s и n будут раскрыты корректно и функция получит нужные аргументы. Разве я не прав?
В данном случае скобки, скорее всего, действительно роли не играют. Я не смог придумать вариант, в котором бы подстановка без скобок дала бы не правильный результат.
Но в других случаях скобки обычно нужны. Так что проще запомнить правило - параметры макросов при использовании заключай в скобки. И делать так всегда, чем каждый раз думать, нужны тут скобки или нет.
Кроме того, если ни я ни вы не придумали подходящего варианта для взлома конструкции, это не значит, что его не может быть в принципе.
Скобки нужны чтобы любое выражение в т.ч. и содержащее запятые было правильно собрано в макрос. А скобки как известно не влияют не перформанс. Тоесть можно их щедрой рукой рассыпать. И если есть кейс СТАВИТЬ или НЕ СТАВИТЬ скобки то я-бы тоже предпочел поставить. И спать спокойно.