为什么Windows API中的所有内容都是自定义的?

Rob*_*ahy 7 c winapi typedef

更具体地说,为什么typedef在许多情况下具有多个不同名称的同一事物,以及为什么typedef指针类型(有时模糊逻辑)?

例如:

typedef const WCHAR *LPCWSTR, *PCWSTR;

那是什么意思?

Bre*_*McK 21

实际上这里有几件不同的事情:

  • 首先是近/远指针:回到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 vs int).它在某种程度上使Windows API独立于底层C实现:C不要求int是特定大小:它可以是16位或32位,具体取决于编译器.但对于OS API,准确指定这些内容非常重要.因此,不是使用int或long,而是使用INT和LONG,然后根据需要定义它,并将typedef用于实际作业的任何底层C类型.

  • 最后,这些typedef中的一些实际上暗示了除了类型信息之外的特定用法.BOOL和INT都typedef为整型,但很显然,指定为BOOL的API参数会在TRUE/FALSE的意义来使用,而不是作为一个整数值.(请记住,这比'bool'类型早.)同样,BYTE - 无符号字符 - 表示参数实际上将用作8位数字值而不是字母数字或符号字符.并且LPSTR指示该值应该是以NUL结尾的字符串,而不是仅指向任意char值.BSTR和LPWSTR具有相同的底层typedef - 它们都是WCHAR* - 但BSTR具有长度前缀,因此必须使用SysAllocString API进行分配,此处具有单独的typedef有助于将两者分开保存在代码和文档API要求中:你看到一个以BSTR作为参数的API,然后你知道你不能只传入一个宽字符串,即使底层类型是相同的,对该参数还有其他要求.

  • 可能与上面的第一点有关 - 由于任何给定类型过去都有两种不同类型的指针(近/远),因此为*两者*使用 typedef(P ... 和 LP ...)是方便且一致的遵循一致的模式,并抽象出任何适当的编译器供应商关键字/修饰符。其中很多内容只有在创建这些 typedef 的原始 Win16 世界的上下文中才有意义:如果近/远指针区别从未存在,那么 BYTE/BYTE* 也会同样有效。 (2认同)

Jim*_*des 7

有PCWSTR和LPCWSTR的原因是在古代有一个区别.LPCWSTR曾经是const WCHAR FAR*.