Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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++ 试图传递字符串变量时出现跟踪宏错误_C++_Visual Studio 2008_Trace - Fatal编程技术网

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字节。