Почему для использования макросов в c / c ++ нужны две скобки? - PullRequest
2 голосов
/ 28 апреля 2011
    KdPrint(("Enter HelloWDMAddDevice\n"));

В чем причина этого?

Ответы [ 5 ]

7 голосов
/ 28 апреля 2011

Таким образом, вы можете передать весь список аргументов в макрос и передать его функции, которая принимает переменное число аргументов.

Я бы поставил на что угодно, что определение этого макроса:

#if DEBUG /* or something like it */
#define KdPrint(args) (printf args)
#else
#define KdPrint(args) /* empty */
#endif

или аналогично какой-либо другой функции, которая работает так же, как printf.

Если бы она была определена как printf (args), то вы могли бы передать только один строковый аргумент, посколькуАргумент макроса не может содержать запятую, которая не находится во вложенных скобках.

3 голосов
/ 28 апреля 2011

Если рассматриваемый макрос был написан неправильно с использованием скобок, это может быть необходимо из-за приоритета оператора. Возьмем этот макрос, например:

#define MY_MACRO(a) a * 11

Хорошо, если вы сделали это:

int b = MY_MACRO(1 + 2);

b вместо 33, как должно быть, на самом деле будет заменено на int b = 1 + 2 * 11, то есть 23, а не 33. Однако если ваш макрос написан не так (без скобок вокруг a) тогда это не нужно.

3 голосов
/ 28 апреля 2011

Это заставляет все внутри пареннов обрабатываться как один параметр для макроса.В показанном примере он может учитывать различные типы параметров:

KdPrint(( "My info is %s\n", "my name" ));

, а также

KdPrint(( "fn %s ln %s\n", "my", "name" ));
1 голос
/ 28 апреля 2011

Если это - это KdPrint(), о котором вы говорите, то это потому, что вы можете использовать макрос KdPrint() с аргументами формата, а не макрос переменной длины.

Например, вы можете сделать:

KdPrint(("The answer is %d\n", 42));

и т. Д.

0 голосов
/ 28 апреля 2011

Для вашего конкретного примера я не могу вам сказать, потому что я не знаю, что такое XdPrint.

Но в более общем случае это потому, что макрос мне просто нравится искать и заменять.Предположим, у вас есть:

#define MULT(a,b) (a*b)

Если вы позвоните MULT(1+1, 2+2), оно станет 1+1*2+2, и в результате вы получите 5 вместо 8, как вы ожидаете.Выполнение MULT((1+1), (2+2)) даст вам ожидаемый результат.Вот почему вам нужно удвоить скобки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...