【问题标题】:Macro's with n number of arguments [duplicate]具有 n 个参数的宏 [重复]
【发布时间】:2011-01-02 20:32:13
【问题描述】:

可能重复:
C/C++: How to make a variadic macro (variable number of arguments)

只是想知道这是否可能。因此,我当前如何处理具有多个参数的日志记录和消息,我不得不为每种情况使用许多不同的宏,例如:

#define MSG(             msg                                    )
#define MSG1(            fmt, arg1                              )
#define MSG2(            fmt, arg1, arg2                        )
#define MSG3(            fmt, arg1, arg2, arg3                  )
#define MSG4(            fmt, arg1, arg2, arg3, arg4            )
#define MSG5(            fmt, arg1, arg2, arg3, arg4, arg5      )
#define MSG6(            fmt, arg1, arg2, arg3, arg4, arg5, arg6)

有没有办法只定义一个可以接受任意数量参数的宏?

谢谢

【问题讨论】:

  • 没有标准方法。但是,最常用的编译器支持可变参数宏。不过,我会让其他人发布该答案。 :)
  • @GMan 我会让问题的幽灵过去回答:stackoverflow.com/questions/679979/…
  • @GMan 的回答总比没有好?
  • 我知道会有其他人加入,我不需要占用所有的代表。 :P (a.k.a brb get food)
  • :) 我刚醒来,这是第一次点击答案:p

标签: c++ macros


【解决方案1】:

好吧,既然@GMan 自己不想将其作为答案,请查看属于 C99 标准的 variadic macros

不过,您的问题已被标记为 C++。可变参数宏不是 C++ 标准的一部分,但大多数编译器都支持它们:从 MSVC2005 开始的 GCC 和 MSVC++。

【讨论】:

  • 因为你试图定义MSG1(fmt, arg1) I bet you're wanting to use something like printf`?
  • 老实说,很多东西都是格式化的字符串,但会输出到一些 UI、日志文件和可能的消息框。但是是的,你是对的,这是 C 而不是 C++,将尝试使用可变参数宏谢谢
  • 当你在玩可变参数宏时,这是我对另一个问题stackoverflow.com/questions/1872220/…的答案的无耻插入
  • 呸,毕竟这似乎 va args 被禁止作为我们编码标准的一部分。我想真的没有其他方法了:(
  • 限制有待推动:D
【解决方案2】:

以下是我用来生成异常的宏——不需要可变参数宏,C++ 目前不支持:

#define CSVTHROW( msg )         \
{                                 \
    std::ostringstream os;         \
    os << msg;                     \
    throw CSVED::Exception(os.str());   \
}                               \

在使用中,您可以说:

CSVTHROW( "Problem caused by " << x << " being less than " << y );

您可以轻松地将 throw 语句替换为写入日志。

【讨论】:

    猜你喜欢
    • 2016-04-21
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多