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)