Variadic Macros:如何解决“宏的实际参数过多..”

Posted

技术标签:

【中文标题】Variadic Macros:如何解决“宏的实际参数过多..”【英文标题】:Variadic Macros : how to solve "too many actual parameters for macro.." 【发布时间】:2010-03-01 05:27:26 【问题描述】:

我一直在努力让我最初在 mac 上构建的一些代码在 Visual Studio 2008 Express 下运行,并且在我用于断言代码的可变参数宏方面遇到了一个奇怪的问题:

宏定义为:

#define SH_ASSERT( assertID, exp, description, ... ) shAssertBasic( int(exp), assertID, description, __LINE__, __FILE__ , ##__VA_ARGS__ ) 

这一切在 gcc(在 osx 下)下运行良好,并且曾经在 VS 2005 下运行,但是在 2008 年我收到以下警告:

 warning C4002: too many actual parameters for macro 'SH_ASSERT'

调用代码很简单:

SH_ASSERT(0, donkeys != aliens , "Donkeys are Aliens Code : Code %d condition %d" , 55, 666);

我确定我错过了一些简单的东西,我的 google foo 让我失望了......

谢谢。

【问题讨论】:

我确认它成功地构建并使用 VS2005 “按原样”运行,即使使用 /W1。我只能说确保SH_ASSERT 没有(重新)在其他地方定义为非可变参数(我怀疑你改变了它)。您可能不能只禁用警告,因为预处理器会丢弃它认为多余的东西。 宏没有被重新定义,我仔细检查了那个。它必须是特定于 2005 -> 2008 差异的东西 【参考方案1】:

更改参数顺序(将描述与 ... 部分放在一起)以执行以下操作:

#define SH_ASSERT( assertID, exp, ... ) shAssertBasic( int(exp), assertID, __LINE__, __FILE__, __VA_ARGS__ )

它应该可以解决问题,您还可以在 Windows 中抑制警告:

#pragma warning (push)
#pragma warning( disable:code/number )
#pragma warning (pop)

【讨论】:

以上是关于Variadic Macros:如何解决“宏的实际参数过多..”的主要内容,如果未能解决你的问题,请参考以下文章

来自 C++ 代码的预处理器指令 (_VARIADIC_MAX)

为啥我的可变参数宏不能正确接受任何参数?

Swift 60秒43 - Variadic functions

格式工厂 Variadic Templates

c语言中三个点的解释 : variadic

variadic function 的使用