Часто и часто я чувствовал, что некоторые из круглых скобок вокруг аргументов в макроопределениях были излишними. Это слишком неудобно вставлять в скобки все. Если я могу гарантировать, что аргумент не должен быть заключен в скобки, могу ли я опустить круглые скобки? Или в скобках их все рекомендуют?Когда можно опустить круглые скобки вокруг аргументов в макросах?
Я придумал этот вопрос, когда я писал:
#define SWAP_REAL(a, b, temp) do{double temp = a; a = b; b= temp;}while(0)
Я думаю, что если аргумент выглядит как L-значение в макросе, скобки можно опустить, так как это означает, что аргумент не появится с не другой работа.
Мои рассуждения:
- ассоциативная приоритет символов присваивания просто выше, чем запятая х.
Вы не можете путать компилятор с мыслью, что ваш аргумент является выражением с запятой в нем. Например,
SWAP(a, b, b)
не будет успешно интерпретировать какdo{double temp = a, b; a, b = b; b= temp;}while(0)
, который может пройти компиляцию.
Я прав? Может ли кто-нибудь дать мне встречный пример?
В следующем примере
#define ADD(a, b) (a += (b))
Я думаю, что аргумент a
не должен быть в круглых скобках. И в этом конкретном случае не нужен аргумент b
, правильно?
@JaredPar:
#include <stdio.h> #define ADD(a, b) (a += (b)) int main(){ int a = 0, b = 1; ADD(a; b, 2); return 0; }
Это не может быть успешно компилируется на моей VS2010. Error C2143: syntax error : missing ')' before ';'
В двух словах, вы не должны скобки аргументы появившись как L-значения в макросе, но настоятельно рекомендуется их все скобки.
Правила макрокоманд:
- НЕ делать макросы с побочными эффектами!
- Что касается макросов без побочного эффекта, просто скопируйте все аргументы, не задумываясь!
- Что касается макросов с побочным эффектом, прекратите быть обсессивно! Обозначьте их все! TnT
Если вам нужно использовать макрос, который не полностью скопирован в скобки, сколько времени вы потратите на выяснение, безопасно ли оно во всех случаях? –
@ KeithThompson наоборот, как вы узнаете, что вы написали макрос правильно, если не знаете, что нужно вставить в скобки? – djechlin
Возможно, вместо этого рассмотрим обратный вопрос - какие макросы, которые можно было бы правдоподобно написать, на самом деле будут разбиты оборонительной скобкой? – Owen