宏参数列表中的指针

Pointer in macro parameter list

本文关键字:指针 列表 参数      更新时间:2023-10-16

我目前正试图定义一个基于编译器标志的函数。如果设置了TRACE标志,那么我想定义一个宏来将信息传递给跟踪组件。

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

Reporter是一个类,在同一个.h文件中定义,位于该宏之上。我需要传递一个报告对象的指针,然后用它来调用跟踪函数。

然而,我得到了一个编译器错误:

错误:"*"可能不会出现在宏中参数列表

我很好奇,如果我只是删除"*"会发生什么——这会导致错误"宏参数必须用逗号分隔"。

你知道我在这里做错了什么吗?

据我所知,至少在C中,宏参数是不类型化的。这都是符号替换。只需使用pReporter而不是Reporter * pReporterReporter pReporter

(我想,这同样适用于宏的其他参数。)

正如JAB所指出的,宏与函数不同,它们不需要参数类型

#define TRACERPTR(pReporter, eComponent, eLevel, sFormat, formatArgs...) 
if (pReporter != NULL) { pReporter->trace(eComponent, eLevel, sFormat, ##formatArgs); }

只需在呼叫中放置&标记:

#define SCAN_INT(str, myInt) (sscanf(str, "%d", myInt))
const char *myString = "23";
int myInteger;
SCAN_INT(myString, &myInteger);

或者你也可以像ncursesgetyx()那样自动化:

#define SCAN_INT(str, myInt) (sscanf(str, "%d", &myInt))
const char *myString = "23";
int myInteger;
SCAN_INT(myString, myInteger);

希望能有所帮助,ief2