1
控制台功能wincon.h
Windows API的一部分定义的数据结构CHAR_INFO
如下:Windows控制台API的CHAR_INFO结构的正确使用
typedef struct _CHAR_INFO {
union {
WCHAR UnicodeChar;
CHAR AsciiChar;
} Char;
WORD Attributes;
} CHAR_INFO, *PCHAR_INFO;
所以我们有一个8位的工会和16位字符分别表示ASCII和Unicode字符。通常情况下,如果你必须处理C中的工会,你已经标记了工会,即有一个额外的领域是存在的,表明正在使用工会的哪些领域。这里不是这种情况(Attributes
用于不同的东西),所以我想知道如何正确使用这种数据类型的值。
如果我们看看API的哪些函数实际上使用了这个或者类似的结构,我们发现它只用于存在两种变体的函数:后缀为A
(用于ASCII变体)或者后缀为W
(用于Unicode变体)。
因此,假设这些函数的A
变体只会使用此结构的AsciiChar
字段,而W
变体只能使用UnicodeChar
字段。如果不是,你怎么知道实际使用的字段以及如何将一个字段转换为另一个字段? MSDN documentation似乎并没有说这里的正确用法。
既没有8位也没有16位字符,除非那些全部大写的自制软件名称与标准的类型不一样。任何你不使用标准名称的原因,但有一些恼人的大写版本?而且你不能“标记工会”。你必须把它包装到一个'struct'中(反之亦然)。 – Olaf
是的,控制台API有两种风格,基于你是否定义了UNICODE。是的,A和W变种。这在十年前停止了,实际的实现总是Unicode。 A风味apis翻译成本地代码页以生成AsciiChar变体。编写Unicode兼容的C或C++代码永远不会意外发生,你总是知道何时使用CHAR_INFO.Char.UnicodeChar。一个神秘的地方,他们为什么不使用TCHAR或将它命名为AnsiChar顺便说一句,有可能是一个设计师,认为它是一个kludge :) –
@Olaf:对不起,我不明白你的意见。上述结构是来自Windows API的'wincon.h'头文件中定义的字面副本,大写字母的类型名称是Windows API使用的约定,它将'CHAR'定义为8位和' WCHAR'是一个16位字符(请参阅[这里](https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v = vs.85).aspx))。此外,联合_is_包裹到结构中。 – siracusa