我尝试定义了一个宏函数,如下所示。调用1没有问题,但是调用2会提示编译器错误,因为缺少第三个参数。如何定义一个宏函数可以同时支持调用1和调用2?
#define RDF_LOG(dbglevel, fmt, ...) (rdfDBG(dbglevel, " " fmt, __VA_ARGS__))
void rdfDBG(int dbglevel, const char *fmt, ...) { /* printf debug message */ }
RDF_LOG(kERROR, "Fail to open file %s\n", pinfile); /* Call 1 */
RDF_LOG(kERROR, "Insufficient Memory\n"); /* call 2 , compiler -> error: expected expression before ')' token */
__VA_ARGS__
前面加上##
,并且零个参数匹配省略号,则会删除尾随逗号吗?例如:#define RDF_LOG(fmt, ...) foo(fmt, ##__VA_ARGS__)
的结果是RDF_LOG("foo")
==>foo("foo")
。 - Adam Rosenfield