首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ACE宏定义错误

ACE宏定义错误
EN

Stack Overflow用户
提问于 2012-12-22 23:06:19
回答 1查看 266关注 0票数 1

我在扩展ACE日志记录宏时遇到了困难。这是一个基本问题,但我不能完全理解它。

我正在尝试使用变量参数列表来制定我自己的ACE日志记录宏。我的编译器(gcc 4.4.6 - 20120305 (RedHat4.4.6-4) (GCC))支持__VA_ARGS__标准。我现在的定义如下:

代码语言:javascript
复制
#define ERROR_PREFIX            ACE_TEXT("ERROR (%T)%?%I")
#define ERROR(FMT,...) ACE_DEBUG((LM_ERROR, ACE_TEXT(FMT) __VA_ARGS__))

我想通过这个调用序列调用它:

代码语言:javascript
复制
ERROR( "This is an example error in file %s\n", errorString.c_str() )

但我最终得到了以下编译错误:

代码语言:javascript
复制
error: expected ‘)’ before ‘errorString’

我应该怎样修改我的宏定义来解决这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-22 23:24:30

我不熟悉ACE,但您似乎正在寻找逗号删除扩展:

代码语言:javascript
复制
#define ERROR(FMT, ...) ACE_DEBUG((LM_ERROR, ACE_TEXT(FMT), ##__VA_ARGS__))

the 'Variadic Macros' section of the GNU CPP manual中所述,当且仅当使用零变量参数调用宏时,将##放在逗号和__VA_ARGS__之间具有删除逗号的特殊效果。因此,

代码语言:javascript
复制
ERROR("This is an example error");
ERROR("This is an example error %s", string);

将分别扩展到

代码语言:javascript
复制
ACE_DEBUG((LM_ERROR, ACE_TEXT("This is an example error")));
ACE_DEBUG((LM_ERROR, ACE_TEXT("This is an example error %s"), string));

这可能就是你想要的(再说一次,我不知道ACE)。三令牌序列, ## __VA_ARGS__中及其周围的间距并不重要,除非您关心非常老的GCC的可移植性,就像在pre-EGCS中一样。

这个特性是一个GNU扩展,也被clang和任何使用启用了GNU兼容模式的EDG前端的东西所支持。最重要的是,据我所知,微软的编译器并不支持它。

(因为快到圣诞节了,我还得提一下,在括号里加个空格会让小耶稣哭。)

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

https://stackoverflow.com/questions/14003885

复制
相关文章

相似问题

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