ACE宏定义错误

时间:2012-12-22 15:06:19

标签: c++ gcc ace

我在扩展ACE日志记录宏时遇到了困难。这是一个基本问题,但我无法绕过它。

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

#define ERROR_PREFIX            ACE_TEXT("ERROR (%T)%?%I")
#define ERROR(FMT,...) ACE_DEBUG((LM_ERROR, ACE_TEXT(FMT) __VA_ARGS__))

我想通过此调用序列调用:

ERROR( "This is an example error in file %s\n", errorString.c_str() )

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

error: expected ‘)’ before ‘errorString’

我应该如何最好地修改我的宏定义来解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

#define ERROR(FMT, ...) ACE_DEBUG((LM_ERROR, ACE_TEXT(FMT), ##__VA_ARGS__))

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

ERROR("This is an example error");
ERROR("This is an example error %s", string);

将分别扩展为

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的可移植性,就像在EGCS之前一样。

此功能是GNU扩展,也支持clang以及任何使用EDG前端且启用了GNU兼容模式的内容。至关重要的是,据我所知,微软的编译器支持

(因为几乎是圣诞节,我还应该提到在你的括号内侧放置空格会让小耶稣哭泣。)