宏的参数个数为n

3

可能是重复问题:
C/C++:如何制作可变参数宏(变量数量)

我在想这是否有可能。因此,不是使用多个参数处理日志和消息的方式,而是需要为每种情况编写许多不同的宏,例如:

#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)

有没有一种定义只能接受任意数量参数的宏的方法?
谢谢

3
没有标准方法。然而,大多数常用编译器都支持可变参数宏。我将让其他人回答这个问题。 :) - GManNickG
2
@GMan 我让“过去问题之灵”来回答:https://dev59.com/MHRB5IYBdhLWcg3wQFPu - Daniel Daranas
@GMan,虽然不是最好的答案,但总比没有强吧? - Gregory Pakosz
我知道还会有其他人加入,没必要让我独占所有的声誉。 :P (也就是说,我去拿食物了) - GManNickG
我刚醒来,这是我第一次点击答案 :p - Gregory Pakosz
显示剩余2条评论
2个回答

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语句轻松替换为写入日志的操作。

2

既然@GMan不想亲自回答,可以看看C99标准中的可变参数宏

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


2
由于您正在尝试定义 MSG1(fmt, arg1),我猜想您想要使用类似于 printf 的东西? - Gregory Pakosz
要说实话,有许多东西,但都将是格式化的字符串,并且输出到UI、日志文件和可能的消息框。但是,是的,你说得对,这是C而不是C++,我会尝试使用可变参数宏。谢谢。 - Stowelly
2
当你在玩可变参数宏时,这里有一个无耻的插件,是我回答另一个问题的答案https://dev59.com/8nI-5IYBdhLWcg3wZ3fC#1872506 - Gregory Pakosz
唉,经过这一切,似乎 va args 已被禁止作为我们的编码标准的一部分。我想没有其他办法了 :( - Stowelly
1
限制存在是为了被突破的 :D - Gregory Pakosz
我被告知合同中有一个条款,规定“使用va args的任何人将被枪杀”。 - Stowelly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接