在 VC++ 6.0 / VS 專案中定義訊息映射表時,編譯器報錯:
error C2440: '初始化': 無法從 'const char [8]' 轉換為 'LPCTSTR'
程式碼片段:
{WM_NULL, "WM_NULL"},
{WM_CREATE, "WM_CREATE"},
// ... 大量類似行
專案設定為 Unicode 字元集(預設),此時:
TCHAR 定義為 wchar_tLPCTSTR 即 const wchar_t*"WM_NULL" 是窄字串字面值(const char*)const char* 到 const wchar_t*{WM_NULL, _T("WM_NULL")},
{WM_CREATE, _T("WM_CREATE")},
// ...
_T("text") 在 Unicode 時展開為 L"text"(寬字串),在 MBCS 時保持 "text"。
專案屬性 → 組態屬性 → 一般 → 字元集 → 選擇「使用多位元組字元集」。
⚠️ 不建議:現代 Windows 開發應預設 Unicode,MBCS 僅為相容舊代碼。
{WM_NULL, L"WM_NULL"},
{WM_CREATE, L"WM_CREATE"},
缺點:失去字元集切換彈性,代碼移植性差。
_T() 或 TEXT() 宏包裹。<tchar.h> 確保宏定義可用。CString 類別(MFC)自動處理字元集轉換:CString str = _T("WM_NULL"); // 自動適配
// 或直接
{WM_NULL, CString(_T("WM_NULL"))},
| 字元集設定 | TCHAR | _T("abc") | LPCTSTR |
|---|---|---|---|
| Unicode | wchar_t | L"abc" | const wchar_t* |
| MBCS | char | "abc" | const char* |
理解此對應關係是解決 MFC/Win32 字串編譯錯誤的關鍵。