c++ - 重载 C 宏

标签 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)

这样称呼

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)

几个注意事项:

  1. __VA_ARGS__ 是提供给宏的逗号分隔参数列表的名称
  2. 您可以使用 sizeof 找出您的情况有多少,因为 p 是一个静态数组
  3. 在 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/

相关文章:

c++ - 重载二元运算的正确方法

c++ - 指定 go build 的 C++ 版本

c++ - 在 C++ 中制作 3d 文本编辑器

c++ - 递归 lambda 的 Typedef

c - 打开文件后出现奇怪的段错误?

c++ - c 向我的编辑器添加自动建议

c - C语言编写Lex和Yacc规则检测#include

c++ - 运算符重载(相同的参数,不同的返回类型)

c++ - 在 while 循环中卡住

c# - 选择不同的重载方法,具体取决于使用空参数调用它的位置