我正在开发一个调用宏的项目。
#define CALL(f,...) FN(f)->call((ref(new LinkedList()), __VA_ARGS__))
当调用它时,
CALL(print,2,3,4,5);
将 2、3、4 和 5 添加到链表中(逗号重载为添加操作),并调用 print 方法。print 方法期望传入一个链表,这个过程也如预期般正常工作。但是有一些调用不需要参数。
CALL(HeapSize);
仍需要一个链表,但是是空的。上面的代码不起作用,我试图想出一个宏可以与任何风格一起工作?
编辑:在研究gcc文档时,我发现在VA_ARGS之前添加##会在没有参数时删除逗号,但是这样我就无法嵌套宏了。
CALL(print,CALL(HeadSize));
这会导致“CALL未定义”错误,但是如果我将调用分开,它就可以工作。
CALL
委托给不同的宏,具体取决于传递给它的参数数量。我在另一个问题的答案中演示了如何实现这一点。这不需要任何特定于实现的技巧。 - James McNellis