ACE宏定义错误
ACE Macro Definition Error
我在扩展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兼容模式的东西支持。关键的是,据我所知,微软的编译器不支持。
(因为快到圣诞节了,我还应该提一下,在括号里面加空格会让婴儿耶稣哭。)
相关文章:
- C++:错误重定义和先前声明
- C++宏定义和取消定义
- 错误:未定义对cv::cudacodec::createVideoReader的引用
- Pybind11 错误未定义对"Py_GetVersion"的引用
- 纯虚拟类和错误未定义对 'vtable 的引用
- 为什么我会收到链接器错误:未定义对 ..?
- 错误 - 自定义数据类型作为有效负载,带有提升::几何
- 根据 c++ 标准在该宏定义中推送/弹出宏时的行为是什么
- 链接错误:未定义对 stdscr 和 wgetch 的引用
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- 尝试构建 xerces c++ 解析器。Netbeans 和命令行构建错误未定义对"xercesc_3_2..."的引用
- 宏定义不正确没有错误
- 错误:未定义的符号:gzclose opencv emscripten
- Visual Studio:snprintf 冲突的宏定义
- 宏定义中的预处理器令牌两边有两个双引号
- 模拟 __name__ = __main__ 在 c++ 中会导致错误"未定义类似函数的宏"
- 如何修复宏定义太大的错误
- 宏定义中的编译器错误"错误:程序中杂散的'\'"
- 使用宏定义获得错误-c++
- ACE宏定义错误