2016-08-16 90 views
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似乎并没有说这里的正确用法。

+0

既没有8位也没有16位字符,除非那些全部大写的自制软件名称与标准的类型不一样。任何你不使用标准名称的原因,但有一些恼人的大写版本?而且你不能“标记工会”。你必须把它包装到一个'struct'中(反之亦然)。 – Olaf

+0

是的,控制台API有两种风格,基于你是否定义了UNICODE。是的,A和W变种。这在十年前停止了,实际的实现总是Unicode。 A风味apis翻译成本地代码页以生成AsciiChar变体。编写Unicode兼容的C或C++代码永远不会意外发生,你总是知道何时使用CHAR_INFO.Char.UnicodeChar。一个神秘的地方,他们为什么不使用TCHAR或将它命名为AnsiChar顺便说一句,有可能是一个设计师,认为它是一个kludge :) –

+0

@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

回答

1

因此,假设这些函数的A变体将仅使用此结构的AsciiChar字段,并且W变体只有UnicodeChar字段,

是的。