mul*_*lle 13 c c++ overloading c-preprocessor
有没有更好的方法来"重载"像这样的宏?我需要一个接受各种参数的宏.
#define DEBUG_TRACE_1(p1) std::string p[] = {p1}; log _log(__FUNCTION__, p, 1)
#define DEBUG_TRACE_2(p1, p2) std::string p[] = {p1, p2}; log _log(__FUNCTION__, p, 2)
#define DEBUG_TRACE_3(p1, p2, p3) std::string p[] = {p1, p2, p3}; log _log(__FUNCTION__, p, 3)
#define DEBUG_TRACE_4(p1, p2, p3, p4) std::string p[] = {p1, p2, p3, p4}; log _log(__FUNCTION__, p, 4)
#define DEBUG_TRACE_5(p1, p2, p3, p4, p5) std::string p[] = {p1, p2, p3, p4, p5}; log _log(__FUNCTION__, p, 5)
Run Code Online (Sandbox Code Playgroud)
这样称呼
DEBUG_TRACE_2("more", "params");
Run Code Online (Sandbox Code Playgroud)
小智 21
执行特定示例的最简单方法是使用可变参数宏:
#define DEBUG_TRACE(...) \
do { \
std::string p[] = { __VA_ARGS__ }; \
log _log(__FUNCTION__, p, (sizeof p) / (sizeof p[0])); \
} while (0)
Run Code Online (Sandbox Code Playgroud)
几个笔记:
__VA_ARGS__
是提供给宏的逗号分隔参数列表的名称sizeof
由于p是静态数组,因此您可以查看在您的情况下使用的数量如果你需要比这更多的灵活性,你可以使用一个非常巧妙的技巧,允许你明确地"重载"宏,使用不同数量的参数完全不同的行为.但是,这使得代码更加复杂,只有在绝对必要的情况下才能使用.由于似乎变量参数对你的用例没问题,我只提供一个链接:http: //efesx.com/2010/07/17/variadic-macro-to-count-number-of-arguments/
a_m*_*m0d 14
可以在宏中使用标准的C/C++可变参数args,至少在gcc中使用(编辑:显然它们是标准化的,MS c编译器也有它们).
有关其工作原理的一些信息,请参阅此页面.
此网站还有另一个问题,可能对您有所帮助.