【问题标题】:ACE Macro Definition ErrorACE 宏定义错误
【发布时间】:2012-12-22 15:06:18
【问题描述】:

我在扩展 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’

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

【问题讨论】:

    标签: c++ gcc ace


    【解决方案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 兼容模式的东西也支持。至关重要的是,据我所知,微软的编译器支持它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      相关资源
      最近更新 更多