更具体地说,为什么是同一件事typedef
在很多情况下都有多个不同的名称,为什么typedef
指针类型(有时会模糊逻辑)?
例如:
typedef const WCHAR *LPCWSTR, *PCWSTR;
这有什么意义呢?
实际上这里发生了一些不同的事情:
首先是近/远指针:回到Win16时代,你有近指针和远指针;近指针基本上只有 16 位偏移量,因此只能引用应用程序默认数据指针(DS 或数据段寄存器)64k 范围内的对象,但它们又小又快;而较大的“远指针”或长指针由段和偏移量组成,因此可以引用 1M 地址空间内的任何内容。当 386 出现时,所有这些段:偏移业务终于消失了,所有指针都只是进入平面 32 位地址空间的 32 位地址。这就是为什么有 P... 和 LP... 版本。
为什么首先要费心使用 typedef 呢?这只是一种方便或简写:输入“LPSTR”比“const char far *”更方便。但它也成为一种可识别的惯用语:您看到 LPSTR 并立即知道 Windows 是如何处理其 API 中的字符串的。
这里还有一个抽象:Windows 通常定义自己的类型版本并使用它们而不是 C 版本。因此 Windows API 使用 DWORD 而不是 int,或者使用 VOID 而不是 void。这是为了填补当时 C 中的一些漏洞——没有 bool,因此引入 BOOL 避免了不同的 API 使用不同的类型来表示布尔值(例如 char 与 int)。它还在某种程度上使 Windows API 独立于底层 C 实现:C 不要求 int 具有特定大小:它可以是 16 位或 32 位,具体取决于编译器。但对于操作系统 API 来说,准确指定这些内容很重要。因此,Windows 不使用 int 或 long,而是使用 INT 和 LONG,然后根据需要进行定义,并将 typedef 指定为执行实际工作的任何底层 C 类型。
最后,其中一些 typedef 实际上暗示了超出类型信息的特定用法。 BOOL 和 INT 都被定义为 int,但很明显,指定为 BOOL 的 API 参数将用于 TRUE/FALSE 含义,而不是作为整数值。 (请记住,这早于“bool”类型。)同样,BYTE(无符号字符)表明参数实际上将用作 8 位数字值,而不是用作字母数字或符号字符。 LPSTR 表示该值应该是一个以 NUL 结尾的字符串,而不是仅仅指向任意 char 值。 BSTR 和 LPWSTR 具有相同的底层 typedef - 它们都是 WCHAR * - 但 BSTR 有长度前缀,因此必须使用 SysAllocString API 进行分配,这里有一个单独的 typedef 有助于在代码和文档 API 要求中保持两者独立:如果您看到一个采用 BSTR 作为参数的 API,那么您就知道不能只传递宽字符串,即使底层类型相同,该参数还有其他要求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)