在 Windows 程式開發中,LPCTSTR 與 wchar_t* 看似都指向寬字元字串,但實際上它們的類型定義隨編譯器設定而異,導致無法直接互轉。
// 在 MBCS (多位元組字元集) 專案中
#define TCHAR char
#define LPCTSTR const char*
// 在 Unicode 專案中
#define TCHAR wchar_t
#define LPCTSTR const wchar_t*
LPCTSTR 實際上是 const TCHAR* 的別名。當專案設定為「使用多位元組字元集」時,TCHAR 解析為 char,此時 LPCTSTR 就是 const char*,與 wchar_t* 完全不同類型;只有在「使用 Unicode 字元集」時,兩者才指向相同的底層類型。
char、wchar_t、char16_t、char32_t 等不同字元類型,避免編碼混淆導致執行期錯誤。LPCTSTR 代表的實際類型不同,編譯器無法在編譯期確定統一的轉換規則。LPCTSTR 即為 const wchar_t*,可直接指派。MultiByteToWideChar / WideCharToMultiByte,或 ATL/MFC 提供的 CA2W、CW2A 巨集類別進行安全轉換。現代 Windows 開發(Windows 2000 以後)強烈建議預設使用 Unicode 字元集,並統一採用 wchar_t / std::wstring / L"字串常值"。若需相容舊版 ANSI API,僅在邊界處做一次轉換,核心邏輯全程使用寬字元,可消除 90% 以上的字串編碼問題。