C++ 试图传递字符串变量时出现跟踪宏错误
当我尝试向C++ 试图传递字符串变量时出现跟踪宏错误,c++,visual-studio-2008,trace,C++,Visual Studio 2008,Trace,当我尝试向跟踪宏传递字符串时,我对宏的调用会导致错误,如下所示: TRACE(_T("PrintAppMsgTrace: %s"), _T(GetCmdIdStr( pMsg[APP_MSG_CODE_OFFSET] ))); 这是我在控制台窗口输出中得到的错误: _CrtDbgReport:字符串太长或IO错误 以下是GetCmdIdStr的原型: char * GetCmdIdStr( BYTE id ); GetCmdIdStr返回指向内存的指针,其中包含类似“APP_ZDO_NLME
跟踪
宏传递字符串时,我对宏的调用会导致错误,如下所示:
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";
}
为什么我会犯这个错误?如有任何想法,将不胜感激。谢谢。宏用于字符串文本。如果您正在编译ANSI,它将扩展为仅原始字符串文字;如果您正在编译UNICODE,它将扩展为带有L
前缀的字符串文字。不能将其应用于函数的返回值
如果可能,最简单的方法是将GetCmdIdStr
函数更改为返回TCHAR
,而不是char
:
TCHAR * GetCmdIdStr( BYTE id )
{
return _T("APP_ZDO_NLME_LEAVE_REQ");
}
我不明白确切的原因,但这似乎奏效了。谢谢。原因是_T()宏中的L前缀使编译器为每个字符分配2个字节,而不是每个字符分配1个字节。它可以在编译时对文本执行此操作,但不能在运行时对变量执行此操作,就像从函数返回一样。因此,根据编译器设置,您将每个字符串1字节传递给跟踪函数,该函数期望每个字符串2字节。