给定以下代码:
void doSomething(int one, int two, int three)
{
//something here
}
#define ONE 1,2,3
#define TWO(arg) doSomething(arg);
#define THREE(arg) TWO(arg)
void doSomethingElse()
{
TWO(ONE)
THREE(ONE)
}visual studio 2010具有以下预处理器输出(省略了一些空行):
void doSomething(int one, int two, int three)
{
}
void doSomethingElse()
{
doSomething(1,2,3);
doSomething(1,2,3);
}而gcc 4.2给出了以下内容:
void doSomething(int one, int two, int three)
{
}
void doSomethingElse()
{
doSomething(1,2,3);
myFile.cpp:17:13: error: macro "TWO" passed 3 arguments, but takes just 1
TWO
}我不确定哪一个是标准的,但我希望它能像visual studio那样工作。有没有办法重构代码,使其在两个编译器中都以这种方式工作?
发布于 2012-10-19 06:30:47
另一种可能是将参数放入括号中,这样它就不会成为替换中的3个参数:
#define ONE 1,2,3
#define TWO_PARENS(arg) doSomething arg;
#define TWO(arg) TWO_PARENS((arg));
#define THREE(arg) TWO_PARENS((arg))
THREE(ONE) 顺便说一句,根据规范,gcc是对的。
发布于 2012-10-19 06:23:09
当您在另一个宏中使用逗号时,需要进行特殊处理。
这应该是可行的:
#define ONE() 1,2,3
#define TWO(ARG) doSomething(ARG());
#define THR(ARG) TWO(ARG)您可以通过将ONE转换为像宏本身一样的功能来立即延迟它的替换。
您可以看到更多在boost documentation site上使用BOOST_PP_COMMA_IF来避免这种情况的示例。
https://stackoverflow.com/questions/12945911
复制相似问题