C++ 变量宏:如何解决;宏的实际参数太多……”;

C++ 变量宏:如何解决;宏的实际参数太多……”;,c++,visual-studio,visual-studio-2008,macros,variadic-functions,C++,Visual Studio,Visual Studio 2008,Macros,Variadic Functions,我一直在努力让我最初构建在mac上的一些代码在Visual Studio 2008 Express下运行,但在我用于断言代码的可变宏方面遇到了一个奇怪的问题: 宏定义为: #define SH_ASSERT( assertID, exp, description, ... ) shAssertBasic( int(exp), assertID, description, __LINE__, __FILE__ , ##__VA_ARGS__ ) 这一切在gcc(osx)下都可以正常工作,并在V

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

宏定义为:

#define SH_ASSERT( assertID, exp, description, ... ) shAssertBasic( int(exp), assertID, description, __LINE__, __FILE__ , ##__VA_ARGS__ ) 
这一切在gcc(osx)下都可以正常工作,并在VS2005下运行,但在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);
我肯定我错过了一些简单的东西,我的谷歌foo让我失望了

谢谢。

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

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

我确认它成功地使用VS2005“按原样”构建和运行,即使使用
/W1
。我所能说的就是确保
SH_ASSERT
没有(重新)在其他地方被定义为非变量(我怀疑你是否改变了这一点)。你可能不能仅仅禁用警告,因为预处理器会扔掉它认为多余的东西。宏没有被重新定义,我仔细检查了它。它一定是针对2005年到2008年的差异