ACE宏定义错误

ACE Macro Definition Error

本文关键字:错误 宏定义 ACE      更新时间:2023-10-16

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

我正试图用变量参数列表制定我自己的ACE日志宏。我的编译器(gcc version 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 %sn", errorString.c_str() )

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

error: expected ‘)’ before ‘errorString’
我应该如何最好地修改我的宏定义来解决这个问题?

我不熟悉ACE,但它显示您正在寻找逗号删除扩展:

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

如GNU CPP手册的"可变宏"一节所述,将##放在逗号和__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)。除非您关心非常旧的 GCC的可移植性,如在前egcs中,否则三个标记序列, ## __VA_ARGS__内和周围的间距无关紧要。

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

(因为快到圣诞节了,我还应该提一下,在括号里面加空格会让婴儿耶稣哭。)