函数原型的约定

Windows SDK 在通用、Windows 代码页Unicode 版本中提供函数原型。 可以编译原型以生成 Windows 代码页原型或 Unicode 原型。 本主题中讨论了这三个原型,由 SetWindowText 函数的代码示例演示。

下面是泛型原型的示例。

BOOL SetWindowText(
  HWND hwnd,
  LPCTSTR lpText
);

头文件提供作为宏实现的泛型函数名称。

#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // !UNICODE

预处理器将宏扩展到 Windows 代码页或 Unicode 函数名称中。 字母“A”(ANSI)或“W”(Unicode)会根据需要添加到泛型函数名称的末尾。 然后,头文件提供两个特定的原型,一个用于 Windows 代码页,一个用于 Unicode,如以下示例所示。

BOOL SetWindowTextA(
  HWND hwnd,
  LPCSTR lpText
);
BOOL SetWindowTextW(
  HWND hwnd,
  LPCWSTR lpText
);

字符串的 Windows 数据类型中所述,泛型函数原型使用文本参数的数据类型 LWINDOWSSTR。 但是,Windows 代码页原型使用 LPCSTR 类型,Unicode 原型使用 LPCWSTR。

对于具有文本参数的所有函数,应用程序通常应使用泛型函数原型。 如果应用程序在头文件的 #include 语句之前或在编译期间定义“UNICODE”,则语句将编译为 Unicode 函数。

注意

新的 Windows 应用程序应使用 Unicode 来避免不同代码页的不一致以及便于本地化。 它们应使用泛型函数编写,并应定义 UNICODE 以将函数编译为 Unicode 函数。 在应用程序必须使用 8 位字符数据的少数位置,它可以显式使用 Windows 代码页的函数。

 

应用程序应始终将泛型函数原型与泛型字符串和字符类型一起使用。 以大写“W”结尾的所有函数名称采用 Unicode,即宽字符、参数。 某些函数仅存在于 Unicode 版本中,并且只能与适当的数据类型一起使用。 例如,LCIDToLocaleNameLocaleNameToLCID 只有 Unicode 版本。

每个 Unicode 和字符集函数的参考文档中的“要求”部分提供有关受支持作系统实现的函数版本的信息。 如果包含以“Unicode”开头的行,该函数具有单独的 Unicode 和 Windows 代码页版本。

注意

当函数具有字符串的长度参数时,长度应记录为字符串中的 TCHAR 值计数。 此数据类型是指函数的 Windows 代码页版本的字节,或 Unicode 版本的 16 位单词。 但是,需要或返回指向非类型化内存块的指针的函数(如 GlobalAlloc 函数)通常采用字节大小,而不考虑所使用的原型。 如果非类型化内存的分配用于字符串,则应用程序必须将字符数乘以 sizeof(TCHAR)。 有关详细信息,请参阅 使用泛型数据类型

 

在 Windows API Unicode