简单的问题,我无法在网上找到答案.在可变参数宏中,如何查找参数的数量?如果它有解决方案,我可以使用boost预处理器.
如果它有所不同,我试图转换可变数量的宏参数来增强预处理器序列,列表或数组以进行进一步的重新处理.
有没有办法编写一个C预处理器宏,根据收到的参数扩展到不同的东西?
#define foo() ???
/* 1 */
foo(name)
/* 2 */
foo(_)
Run Code Online (Sandbox Code Playgroud)
期望的结果:
/* 1 */
int name;
/* 2 */
/*ignore*/
Run Code Online (Sandbox Code Playgroud)
是的,我知道宏是邪恶的.我主要是出于好奇而问这个问题.
创建可变参数宏的技巧是什么FOO(a1, a2, a3,..., an),它可以扩展到您选择的任何预选有界范围内的FOOn(a1, a2, a3,..., an)值n?也就是说,FOO(a)应该扩展FOO1(a),FOO(a, b, c)对FOO3(a, b, c)等,我知道有一个标准的把戏,但我似乎无法找到它.
请随意将此问题标记为副本,如果答案中还有其他问题,请将其关闭.我怀疑有,但我找不到它.
我目前正在完成一个库,并希望我的"调试"日志功能在编译时是可选的.
我的想法是:检查是否DEBUG已定义,然后定义我的自定义debug函数.
这就是我所做的(一部分)
#if defined(DEBUG)
#define debug(s) Serial.println(s)
#define debug(s,t) Serial.print(s);Serial.println(t)
#else
#define debug(s) // s
#define debug(s,t) // s t
#endif
Run Code Online (Sandbox Code Playgroud)
(我正在为Arduino编译;这就是为什么我需要将函数分成两部分.)
由于我花了很多时间,Serial.print成功了Serial.println,我想要的debug(s),也接受了两个"参数".
因此,在插入debug("ParamOne");和debug("ParamOne", "ParamTwo");将导致定义函数.
但是,显然,只有最后定义的调试有效,否则会覆盖第一个.
我应该怎么做,保持功能的相同名称,还是有任何更"正确"的做法?