Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ACE宏定义错误_C++_Gcc_Ace - Fatal编程技术网

C++ ACE宏定义错误

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

我在扩展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_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兼容模式的设备的支持。关键是,据我所知,微软的编译器不支持它

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