介紹

以一個或多個字串作為引數的函式的 Windows API 文件通常如下所示:

BOOL WINAPI CopyFile(
  _In_ LPCTSTR lpExistingFileName,
  _In_ LPCTSTR lpNewFileName,
  _In_ BOOL    bFailIfExists
);

兩個字串引數的資料型別由幾部分組成:

  • LP =長指標
  • C =常數
  • T = TCHAR
  • STR =字串

現在 TCHAR 是什麼意思?這取決於為程式編譯選擇的平臺。

CopyFile 本身只是一個巨集,定義如下:

#ifdef UNICODE
#define CopyFile CopyFileW
#else
#define CopyFile CopyFileA
#endif

所以實際上有兩個 CopyFile 函式,並且根據編譯器標誌,CopyFile 巨集將解析為一個或另一個。

有核心令牌,TCHAR 定義為:

#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

因此,根據編譯標誌,TCHAR 是(2 位元組)字元。

因此,當定義 UNICODE 時,CopyFile 被定義為 CopyFileW,它將使用 2 位元組字元陣列作為引數,預計將採用 UTF-16 編碼。

如果沒有定義 UNICODE,CopyFile 被定義為 CopyFileA,它使用單位元組字元陣列,預計將以當前使用者的預設 ANSI 編碼進行編碼。

有兩個類似的巨集:UNICODE 使 Windows API 期望寬字串和 _UNICODE(帶有前導下劃線),它在 C 執行時庫中啟用類似的功能。

這些定義允許我們編寫以 ANSI 和 Unicode 模式編譯的程式碼。

重要的是要知道 ANSI 編碼可以是單位元組編碼(即 latin-1)多位元組編碼(即移位 jis),但遺憾的是,utf-8 不能很好地支援。

這意味著這些函式的 ANSI 和寬字元變體都不能用於固定寬度編碼。