C++ ACE宏定义错误
我在扩展ACE日志宏时遇到困难。这是一个基本的问题,但我不能对它掉以轻心 我正试图用变量参数列表制定我自己的ACE日志宏。我的编译器(gcc版本4.4.6 20120305(Red Hat 4.4.6-4)(gcc))支持C++ ACE宏定义错误,c++,gcc,ace,C++,Gcc,Ace,我在扩展ACE日志宏时遇到困难。这是一个基本的问题,但我不能对它掉以轻心 我正试图用变量参数列表制定我自己的ACE日志宏。我的编译器(gcc版本4.4.6 20120305(Red Hat 4.4.6-4)(gcc))支持\uu VA\u ARGS\uu标准。我目前的定义如下: #define ERROR_PREFIX ACE_TEXT("ERROR (%T)%?%I") #define ERROR(FMT,...) ACE_DEBUG((LM_ERROR, ACE_TEX
\uu VA\u ARGS\uu
标准。我目前的定义如下:
#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’
如何最好地修改宏定义以解决此问题?我不熟悉ACE,但您似乎正在寻找逗号删除扩展:
#define ERROR(FMT, ...) ACE_DEBUG((LM_ERROR, ACE_TEXT(FMT), ##__VA_ARGS__))
如中所述,当且仅当使用零变量参数调用宏时,将##
置于逗号和uu VA_uargs_uu
之间具有删除逗号的特殊效果。因此,
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_uargs_uu
中及其周围的间隔并不重要,除非您关心到非常旧的GCC的可移植性,如前EGCS
此功能是GNU扩展,也受clang和任何使用EDG前端并启用GNU兼容模式的设备的支持。关键是,据我所知,微软的编译器不支持它
(因为快到圣诞节了,我还应该提到,在括号内加空格会让婴儿耶稣哭泣。)我不熟悉ACE,但您似乎在寻找逗号删除扩展名:
#define ERROR(FMT, ...) ACE_DEBUG((LM_ERROR, ACE_TEXT(FMT), ##__VA_ARGS__))
如中所述,当且仅当使用零变量参数调用宏时,将##
置于逗号和uu VA_uargs_uu
之间具有删除逗号的特殊效果。因此,
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_uargs_uu
中及其周围的间隔并不重要,除非您关心到非常旧的GCC的可移植性,如前EGCS
此功能是GNU扩展,也受clang和任何使用EDG前端并启用GNU兼容模式的设备的支持。关键是,据我所知,微软的编译器不支持它
(因为快到圣诞节了,我还应该提到,在括号内加空格会让婴儿耶稣哭泣。)