Ошибка макроса трассировки при попытке передать строковую переменную

#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 байта на символ.