显式使用 Unicode/ANSI Windows API 和让它们由别名处理之间的区别?
Difference between explicitly using Unicode/ANSI Windows APIs and letting them be handled by aliases?
我将项目中使用的每个 Win32 API 显式定义为 W(宽)或 A(ANSI)与让其由 solution/project 配置决定有什么区别?除了能够即时更改它之外,就是这样。
假设出于某种原因我现在只需要 Unicode,让它们自动扩展到正确的还是明确定义它们对我来说更好?
如果我只为 ANSI 或 Unicode 开发而不是同时支持两者,它会在发布时破坏某些系统吗?
基于 "ANSI" 字符集 (Windows 9x) 的最后一个 Windows 版本很久以前就已停产。所有较新的版本(基于 NT),甚至是嵌入式版本,都使用 UTF-16 来提供完整的 Unicode 支持。对于那些,所有 ANSI 函数都作为包装器实现,这会导致开销(转换需要时间和 space)和数据丢失(ANSI 只是 Unicode 的一个子集)。
我只会使用宽版。特别是,在导出接口时,我会避免使用基于 TCHAR 的字符串,因为它需要我提供两种不同的实现,而且现代代码不需要它。
你应该更喜欢 W 变体的主要原因是当你处理字符串时 A 调用是不可靠的——它们总是暗示隐式代码页,这是可变的。所以程序行为取决于系统设置,这从来都不好。他们将来重新定义 TCHAR 的可能性非常接近于零 - 这种变化没有技术优势,而且会破坏很多东西,所以担心这个没有意义。
我将项目中使用的每个 Win32 API 显式定义为 W(宽)或 A(ANSI)与让其由 solution/project 配置决定有什么区别?除了能够即时更改它之外,就是这样。
假设出于某种原因我现在只需要 Unicode,让它们自动扩展到正确的还是明确定义它们对我来说更好? 如果我只为 ANSI 或 Unicode 开发而不是同时支持两者,它会在发布时破坏某些系统吗?
基于 "ANSI" 字符集 (Windows 9x) 的最后一个 Windows 版本很久以前就已停产。所有较新的版本(基于 NT),甚至是嵌入式版本,都使用 UTF-16 来提供完整的 Unicode 支持。对于那些,所有 ANSI 函数都作为包装器实现,这会导致开销(转换需要时间和 space)和数据丢失(ANSI 只是 Unicode 的一个子集)。
我只会使用宽版。特别是,在导出接口时,我会避免使用基于 TCHAR 的字符串,因为它需要我提供两种不同的实现,而且现代代码不需要它。
你应该更喜欢 W 变体的主要原因是当你处理字符串时 A 调用是不可靠的——它们总是暗示隐式代码页,这是可变的。所以程序行为取决于系统设置,这从来都不好。他们将来重新定义 TCHAR 的可能性非常接近于零 - 这种变化没有技术优势,而且会破坏很多东西,所以担心这个没有意义。