c++ - ACE 宏定义错误

标签 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’

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

最佳答案

我不熟悉 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 和任何使用启用了 GNU 兼容模式的 EDG 前端的东西的支持。重要的是,据我所知,Microsoft 的编译器支持它。

(因为快到圣诞节了,我还要提一下,在括号内放置空格会让婴儿耶稣哭泣。)

关于c++ - ACE 宏定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14003885/

相关文章:

c - 为什么 C 编译器优化 switch 和 if 不同

c - float_t 有什么意义,什么时候应该使用它?

c++ - CMake 错误 : variable is NOTFOUND. ACE_INCLUDE_DIR(高级)

c++ - 尝试从 time_point (C++) 中减去 std::chrono::duration,但我的代码未编译。有什么建议么?

c++ - 在对象构造期间获取大多数派生类型

python - 编译官方文档 "Embedding Python in Another Application"示例失败

ssl - ACE SSL 错误 : peer did not return a certificate

c++ - std::is_signed<bool>::value 是否保证返回 false?

c++ - 在 netbeans (windows) 中编译一个 hello world C++ 项目需要 2 秒