首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc vs. studio宏扩展

gcc vs. studio宏扩展
EN

Stack Overflow用户
提问于 2012-10-18 09:42:01
回答 2查看 1.8K关注 0票数 6

给定以下代码:

代码语言:javascript
复制
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具有以下预处理器输出(省略了一些空行):

代码语言:javascript
复制
void doSomething(int one, int two, int three)
{

}    

void doSomethingElse()
{
   doSomething(1,2,3);

   doSomething(1,2,3);    
}

而gcc 4.2给出了以下内容:

代码语言:javascript
复制
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那样工作。有没有办法重构代码,使其在两个编译器中都以这种方式工作?

EN

回答 2

Stack Overflow用户

发布于 2012-10-19 06:30:47

另一种可能是将参数放入括号中,这样它就不会成为替换中的3个参数:

代码语言:javascript
复制
#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是对的。

票数 3
EN

Stack Overflow用户

发布于 2012-10-19 06:23:09

当您在另一个宏中使用逗号时,需要进行特殊处理。

这应该是可行的:

代码语言:javascript
复制
#define ONE() 1,2,3
#define TWO(ARG) doSomething(ARG());
#define THR(ARG) TWO(ARG)

您可以通过将ONE转换为像宏本身一样的功能来立即延迟它的替换。

您可以看到更多在boost documentation site上使用BOOST_PP_COMMA_IF来避免这种情况的示例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12945911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档