2011-05-18 45 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