使用泛型数据类型

如果在代码中使用泛型数据类型,则只需使用预处理器指令在头文件的#include语句之前定义“UNICODE”,就可以针对 Unicode 编译它。 若要编译 Windows (ANSI) 代码页的代码,请省略“UNICODE”定义。 新的 Windows 应用程序应使用 Unicode 来避免不同代码页的不一致并简化本地化。

若要创建可编译为使用 Unicode 字符和字符串或使用 Windows 代码页中的字符和字符串的源代码,请执行以下操作:

  1. 对于用于文本的所有字符和字符串类型,请使用泛型数据类型,例如 TCHAR、LPTSTR 和 LPTCH。 有关泛型类型的详细信息,请参阅 字符串的 Windows 数据类型

  2. 确保指向非文本数据缓冲区或二进制字节数组的指针使用数据类型(如 LPBYTE 或 LPWORD)而不是 LPTSTR 或 LPTCH 类型进行编码。

  3. 根据需要使用 LPVOID 将不确定类型的指针显式声明为 void 指针。

  4. 使指针算术类型与类型无关。 如果定义了 UNICODE,则使用 TCHAR 大小的单位会生成 2 字节的变量;如果未定义 UNICODE,则为 1 字节。 使用指针算术始终返回指针指示的元素数,无论元素的大小是 1 个字节还是 2 个字节。 无论是否定义了 UNICODE,以下表达式始终检索元素数。

    cCount = lpEnd - lpStart;
    

    以下表达式确定使用的字节数。

    cByteCount = (lpEnd - lpStart) * sizeof(TCHAR);
    

    无需更改如下语句,因为指针增量指向下一个字符元素。

    chNext = *++lpText;
    
  5. 将文本字符串和清单字符常量替换为宏。 更改如下所示的表达式。

    while(*lpFileName++ != '\\')
    {
        // ...
    }
    

    在此表达式中使用 TEXT 宏,如下所示。

    while(*lpFileName++ != TEXT('\\'))
    {
        // ...
    }
    

    当定义 UNICODE 时, TEXT 宏会导致字符串计算为 L“string”,否则计算为“string”。 为了便于管理,请将文本字符串移动到资源中,尤其是当它们包含 ASCII 范围之外的字符时, (0x00 0x7F) 或在用户界面上公开。 为了支持将应用程序本地化为不同的国家/地区语言,所有用户界面字符串都位于可本地化的资源中非常重要。

  6. 使用 Windows 函数的泛型版本。 有关详细信息,请参阅 函数原型的约定

  7. 使用标准 C 库字符串函数的泛型版本,并记得定义“_UNICODE”和“UNICODE”,如 标准 C 函数中所述。

  8. 如果要改编最初为 Windows 代码页编写的应用程序,请记得更改依赖 255 作为字符最大值的任何代码。

编译如上所述编写的代码时,编译器可以从同一源创建应用程序的 Unicode 和 Windows 代码页版本。 根据 UNICODE 的定义,将解析泛型函数以生成相同的二进制文件,就像你专门为 Unicode 编写代码或专门为 Windows 代码页编写代码一样。

使用 Unicode 和字符集