有没有更好的方法来“重载”这样的宏?我需要一个接受不同数量参数的宏。
#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)
这样称呼
DEBUG_TRACE_2("more", "params");
最佳答案
执行特定示例的最简单方法是使用可变参数宏:
#define DEBUG_TRACE(...) \
do { \
std::string p[] = { __VA_ARGS__ }; \
log _log(__FUNCTION__, p, (sizeof p) / (sizeof p[0])); \
} while (0)
几个注意事项:
__VA_ARGS__
是提供给宏的逗号分隔参数列表的名称- 您可以使用
sizeof
找出您的情况有多少,因为 p 是一个静态数组 - 在 do..while 中围绕宏代码通常被认为是一种很好的做法,因为它为变量 (p) 提供了 block 作用域,因此用户仍然可以在宏之外拥有同名的变量,而 while (0) 部分很好if 语句之后接受分号而不换行
如果您需要比这更大的灵 active ,您可以使用一个非常巧妙的技巧,让您显式地“重载”宏,使其在不同数量的参数下表现完全不同。但是,这会使代码更加复杂,只有在绝对必要时才应该使用。由于看起来可变参数对您的用例来说很好,我将只提供一个链接: http://efesx.com/2010/07/17/variadic-macro-to-count-number-of-arguments/
关于c++ - 重载 C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8886812/