wishel 发表于 2009-11-15 18:08:32

为什么在ACE_ERROR中 %N:%l: 不能正确展开?

为什么在ACE_ERROR中 %N:%l:
不能正确展开?而ACE_DEBUG却可以

比如:
ACE_ERROR
((LM_ERROR,
"%p\n",
"%N:%l: @@@@@@@@@@@@@@@@"));
ACE_DEBUG
((LM_DEBUG,
"%N:%l: @@@@@@@@@@@@@@@@\n"));
结果为:

%N:%l: @@@@@@@@@@@@@@@@: Success
../test.cpp:155: @@@@@@@@@@@@@@@@

winston 发表于 2009-11-16 20:53:01

#define ACE_DEBUG( X    )   
Value:
do { \
    int __ace_error = ACE_Log_Msg::last_error_adapter (); \
    ACE_Log_Msg *ace___ = ACE_Log_Msg::instance (); \
    ace___->conditional_set (__FILE__, __LINE__, 0, __ace_error); \
    ace___->log X; \
} while (0)

#define ACE_ERROR( X    )   
Value:
do { \
    int __ace_error = ACE_Log_Msg::last_error_adapter (); \
    ACE_Log_Msg *ace___ = ACE_Log_Msg::instance (); \
    ace___->conditional_set (__FILE__, __LINE__, -1, __ace_error); \
    ace___->log X; \
} while (0)


我比较了一下定义,差别只有一处,难道是那里的问题?估计要跟踪进去才知道了。


modern 发表于 2009-11-17 10:25:58

如果我没看错的话%p,是小写的吧。
印象里小写的%p貌似打印进程ID,
大写的%P才是打印Errno吧

wishel 发表于 2009-11-19 16:46:38

查了下APG。
P:Current process ID
p:Specified character string, followed by the appropriate errno message, that is, as done by perror()
N: File name where logging macro appears
l: Line number where logging macro appears
只能跟进去看了,但是Log_Msg的架构相当复杂,看起来应该比较花时间,等有精力的时候再去看吧。。。

modern 发表于 2009-11-19 16:53:42

ACE_ERROR((LM_ERROR,
                "%N:%l %p\n",
                "@@@@@@@@@@@@@@@@"));
这么写就可以了。
原因,%N%l需要放在第一个字符串中,ACE日志才会识别。
放在后面的字符串中,不会进行转义。

wishel 发表于 2009-11-19 16:55:54

ok, 谢谢modern:handshake
页: [1]
查看完整版本: 为什么在ACE_ERROR中 %N:%l: 不能正确展开?