C++ 显式使用Unicode/ANSI Windows API和通过别名处理它们之间的区别?

C++ 显式使用Unicode/ANSI Windows API和通过别名处理它们之间的区别?,c++,winapi,unicode,ansi,C++,Winapi,Unicode,Ansi,我将项目中使用的每个Win32 API显式定义为W-Wide或ANSI,并让它由解决方案/项目配置决定,两者之间有什么区别?除了能够在飞行中改变它,也就是说 如果出于某种原因,我现在只需要Unicode,那么让它们自动或显式地扩展到正确的版本会更好吗? 如果我只为ANSI或Unicode开发,而不同时支持两者,会不会破坏一些发布系统?基于ANSI字符集的Windows 9x的最新版本很久以前就已经过时了。所有基于NT的更新版本,甚至是嵌入式版本,都使用UTF-16来提供完全的Unicode支持。

我将项目中使用的每个Win32 API显式定义为W-Wide或ANSI,并让它由解决方案/项目配置决定,两者之间有什么区别?除了能够在飞行中改变它,也就是说

如果出于某种原因,我现在只需要Unicode,那么让它们自动或显式地扩展到正确的版本会更好吗?
如果我只为ANSI或Unicode开发,而不同时支持两者,会不会破坏一些发布系统?

基于ANSI字符集的Windows 9x的最新版本很久以前就已经过时了。所有基于NT的更新版本,甚至是嵌入式版本,都使用UTF-16来提供完全的Unicode支持。对于这些函数,所有ANSI函数都是作为包装器实现的,这会导致开销转换需要时间和空间,并且数据丢失ANSI只是Unicode的一个子集


我只会使用宽版本。特别是在导出接口时,我会避免使用基于TCHAR的字符串,因为它需要我提供两种不同的实现,而且现代代码不需要它。

您选择W变体的主要原因是,当您处理字符串时,A调用是不可靠的-它们总是暗示隐式代码页,这是可变的。因此,程序行为取决于系统设置,这永远都不是好的。他们将来重新定义TCHAR的可能性非常接近于零——这一变化没有技术优势,而且会破坏很多东西,因此担心这一点毫无意义。

如果出于某种原因,微软决定使用UTF32而不是UTF16,并反对宽字符函数,如果您一直在使用别名和T-family宏,那么您所需要做的就是重新编译,希望它能正常工作。如果你直接使用这些函数,你还有很多工作要做。这是一个极不可能发生的情况,但目前我唯一能想到的情况。使用Unicode类型和函数而不是宏的优点是代码更清晰。您不打算支持Windows 98,那么为什么要编写代码来支持它呢。如果没有Unicode支持,您将永远无法编译。保持生活简单,避免不必要的间接。@DavidHeffernan:泛型文本映射实际上不仅仅是过去遗留下来的过时的东西。它们充当一个可以从外部控制的开关。虽然可能不太可能,但Joachim的评论概括了一种情况,即通用文本映射可能是向前发展的正确方式。@i我认为,它们是过去遗留下来的古老内容。可能需要指出的是,越来越多的函数不再具有*A/*W变体。只有一个版本,它需要WCHAR。