2011-05-18 43 views
0

我的电话给TRACE宏正导致一个错误,当我试图将一个字符串传递给它,如下所示:跟踪宏错误尝试传递字符串变量

TRACE(_T("PrintAppMsgTrace: %s"), _T(GetCmdIdStr(pMsg[APP_MSG_CODE_OFFSET]))); 

这是我在得到错误控制台窗口输出:

_CrtDbgReport:字符串太长或IO错误

这里是原型GetCmdIdStr

char * GetCmdIdStr(BYTE id); 

GetCmdIdStr返回一个指针,指向包含类似 “APP_ZDO_NLME_LEAVE_REQ” 存储器。它基本上是这样工作的:

char * GetCmdIdStr(BYTE id) 
{ 
    return "APP_ZDO_NLME_LEAVE_REQ"; 
} 

为什么我得到这个错误?任何想法将不胜感激。谢谢。

回答

1

_T()宏用于字符串文字。它扩展为原始字符串文字,如果您正在编译ANSI,或者如果您正在编译UNICODE,那么字符串文字的前缀为L。您不能将其应用于函数的返回值。

如果可能的话,做最简单的事情是改变GetCmdIdStr函数返回TCHAR而不是char

TCHAR * GetCmdIdStr(BYTE id) 
{ 
    return _T("APP_ZDO_NLME_LEAVE_REQ"); 
} 
+0

我完全不明白为什么,但似乎这样的伎俩。谢谢。 – 2011-05-18 19:27:38

+1

原因是_T()宏的L前缀使编译器为每个字符分配2个字节,而不是每个字符1个字节。它可以在编译时在文字上做到这一点,但它不能在运行时在变量上执行,就像你从函数返回一样。因此,根据编译器设置,您将每字符1个字节的字符串传递给TRACE函数,期望每字符2个字节的字符串。 – Chadwick 2011-05-18 20:01:33