我目前正在尝试根据编译器标志定义一个函数。如果设置了TRACE标志,那么我想定义一个宏来将信息传递给跟踪组件。
#define TRACERPTR(Reporter * pReporter, traceComponent eComponent, traceLevel eLevel, string sFormat, formatArgs...) \
if (pReporter != NULL) { pReporter->trace(eComponent, eLevel, sFormat, ##formatArgs); }
Reporter是一个类,在同一个.h文件中定义,位于此宏之上。我需要传递一个记者对象的指针,然后用它来调用跟踪函数。
但是,我收到编译错误:
错误:“*”可能不会出现在宏中 参数列表
我很好奇如果我删除了“*”会发生什么 - 这会导致错误“宏参数必须以逗号分隔”。
知道我在这里做错了什么?
答案 0 :(得分:9)
据我所知,在C中,至少没有输入宏参数。这都是符号替换。只需使用pReporter
而不是Reporter * pReporter
或Reporter pReporter
。
(我想这同样适用于你的宏的其他参数。)
答案 1 :(得分:3)
正如JAB所指出的,宏与函数不同,它们不需要参数类型
#define TRACERPTR(pReporter, eComponent, eLevel, sFormat, formatArgs...) \
if (pReporter != NULL) { pReporter->trace(eComponent, eLevel, sFormat, ##formatArgs); }
答案 2 :(得分:-1)
只需在通话中放置&
标记:
#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