#c #visual-studio-2008 #trace
#c #visual-studio-2008 #трассировка
Вопрос:
Мои вызовы TRACE
макроса приводят к ошибке, когда я пытаюсь передать ему строку следующим образом:
TRACE(_T("PrintAppMsgTrace: %s"), _T(GetCmdIdStr( pMsg[APP_MSG_CODE_OFFSET] )));
Это ошибка, которую я получаю при выводе окна консоли:
_CrtDbgReport: слишком длинная строка или ошибка ввода-вывода
Вот прототип для GetCmdIdStr
:
char * GetCmdIdStr( BYTE id );
GetCmdIdStr
возвращает указатель на память, содержащий что-то вроде «APP_ZDO_NLME_LEAVE_REQ». По сути, это работает следующим образом:
char * GetCmdIdStr( BYTE id )
{
return "APP_ZDO_NLME_LEAVE_REQ";
}
Почему я получаю эту ошибку? Любые мысли были бы оценены. Спасибо.
Ответ №1:
_T()
Макрос используется для строковых литералов. Она расширяется либо до исходного строкового литерала, если вы компилируете ANSI, либо до строкового литерала с L
префиксом, если вы компилируете UNICODE. Вы не можете применить ее к возвращаемому значению функции.
Если возможно, проще всего было бы изменить GetCmdIdStr
функцию на return TCHAR
вместо char
:
TCHAR * GetCmdIdStr( BYTE id )
{
return _T("APP_ZDO_NLME_LEAVE_REQ");
}
Комментарии:
1. Я не совсем понимаю, почему, но, похоже, это помогло. Спасибо.
2. Причина в том, что префикс L из макроса _T() заставляет компилятор выделять 2 байта на символ, а не 1 байт на символ. Это может быть сделано во время компиляции для литерала, но не может сделать это во время выполнения для переменной, как при возврате из функции. Итак, в зависимости от настроек компилятора, вы передавали строку размером 1 байт на символ в функцию TRACE, ожидая строку размером 2 байта на символ.