Указатель в списке параметров макроса - PullRequest
0 голосов
/ 20 июня 2011

В настоящее время я пытаюсь определить функцию на основе флага компилятора.Если установлен флаг TRACE, то я хочу определить макрос для передачи информации компоненту трассировки.

#define TRACERPTR(Reporter * pReporter, traceComponent eComponent, traceLevel eLevel, string sFormat, formatArgs...) \
if (pReporter != NULL) { pReporter->trace(eComponent, eLevel, sFormat, ##formatArgs); }

Reporter - это класс, определенный в том же файле .h над этим макросом.Мне нужно передать указатель на объект репортера, который затем используется для вызова функции трассировки.

Однако я получаю ошибку компилятора:

ошибка: «*» можетне отображаются в списке параметров макроса

Мне было любопытно, что произойдет, если я просто уберу "*" - что приводит к ошибке "параметры макроса должны быть разделены запятыми".

Есть идеи, что я здесь делаю не так?

Ответы [ 3 ]

9 голосов
/ 20 июня 2011

Насколько мне известно, в Си, по крайней мере, макропараметры не набираются.Это замена всех символов.Просто используйте pReporter вместо Reporter * pReporter или Reporter pReporter.

(Полагаю, это относится и к другим параметрам вашего макроса.)

3 голосов
/ 20 июня 2011

Как указал JAB, макросы отличаются от функций, им не требуется тип аргументов

#define TRACERPTR(pReporter, eComponent, eLevel, sFormat, formatArgs...) \
if (pReporter != NULL) { pReporter->trace(eComponent, eLevel, sFormat, ##formatArgs); }
0 голосов
/ 20 июня 2011

Просто поставьте отметку & в своем звонке:

#define SCAN_INT(str, myInt) (sscanf(str, "%d", myInt))

const char *myString = "23";
int myInteger;
SCAN_INT(myString, &myInteger);

Или вы можете автоматизировать ее, как ncurses 'getyx():

#define SCAN_INT(str, myInt) (sscanf(str, "%d", &myInt))

const char *myString = "23";
int myInteger;
SCAN_INT(myString, myInteger);

Надеюсьпомогает, ief2

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