为什么Win32-API有这么多自定义类型?

sub*_*sub 26 c winapi

我是Win32 API的新手,许多新类型开始让我感到困惑.

一些函数将1-2 ints和3 UINTS作为参数.

  • 为什么他们不能只使用整数?什么是UINTS?

然后,还有其他类型:

DWORD LPCWSTR LPBOOL 
Run Code Online (Sandbox Code Playgroud)
  • 同样,我认为"原始"C类型就足够了 - 为什么要引入100种新类型?

这个是痛苦的: WCHAR*

我不得不遍历它并将每个字符push_back到std :: string,因为没有其他方法可以将它转换为一个.可怕.

  • 为什么WCHAR?为什么重新发明轮子?他们本来可以用char*,或者?

Kri*_*son 48

Windows API最早是在20世纪80年代创建的,多年来不得不支持几种不同的CPU架构和编译器.他们已经从单用户单进程独立系统转变为网络化多用户多核安全意识系统.他们不得不解决16位与32位处理器以及现在64位处理器的问题.他们必须解决ANSI C之前的编译器问题.他们必须在早期非标准化时代支持C++编译器.他们不得不处理分段记忆.在Unicode存在之前,他们必须支持国际化.他们必须支持与MS-DOS,OS/2和Mac OS的一些源级兼容性.他们不得不运行几代英特尔芯片,PowerPC,MIPS,Alpha和ARM.桌面,服务器,移动和嵌入式系统使用相同的基本API.

早在20世纪80年代,C被认为是一个高层次的语言(是的,真的!),很多人认为这是很好的形式使用抽象类型,而不仅仅是指定的一切作为原始int,charvoid *.当我们没有IntelliSense和infotips以及代码浏览器和在线文档等时,这些使用提示很有帮助,并且它使得在不同编译器和不同编程语言之间移植代码变得更加容易.

是的,这是一个可怕的混乱,但这并不意味着他们做错了什么.

  • Windows API遗产中一个更明显的工件是许多指针类型上使用的"LP`"前缀 - 该前缀代表"长指针"(也称为"远指针"),并且是许多参数所必需的到Win16的底层分段架构,其中指针可以"靠近"(指向假定的段内)或"远"(段指定为指针的一部分).Win32的远近指针早已不复存在,但名称保持不变. (12认同)
  • @Mads:忘了吗?几乎不.保留旧定义允许更新旧应用程序而无需重写它们. (8认同)
  • 在这里添加众多原因的另一个原因是跨不同语言的互操作性.例如,您可以从VB调用本机代码,Windows API需要确保所有内容都使用例如"32位无符号整数",而不是希望您的C编译器视为`unsigned int`与您的匹配VB`UInteger`或Delphi`Cardinal`,或者可以强制进入你的VB`Engger`或Pascal`LongInt`等等. (4认同)
  • 这有点好笑。Windows 平台头文件仍然定义了 FAR 指针。奇怪的是,20 多年后,他们仍然没有清理烂摊子。C Win32 API 感觉就像被遗忘了一样。 (3认同)
  • 另一个明显的工件是WPARAM类型."W"最初代表"字",意思是16位值.现在,它是一个32位值,但它们保留了"W"前缀.有关其他评论,请参阅http://blogs.msdn.com/oldnewthing/archive/2003/11/25/55850.aspx. (2认同)

Pau*_*sik 5

Win32实际上只有很少的原始类型.你所看到的是数十年的#defines和typedef以及匈牙利表示法.因为类型很少而且很少或没有智能感知开发人员给自己提供了关于特定类型实际应该做什么的"线索".

例如,没有布尔类型,但有一个整数的"别名"表示,告诉您特定变量应该被视为布尔值.看一下WinDef.h的内容,看看我的意思.

你可以看看这里:http://msdn.microsoft.com/en-us/library/aa383751 (VS.85).aspx,可以看到真正的冰山一角.例如,注意HANDLE是如何作为windows对象"句柄"的每个其他对象的基本typedef.当然,HANDLE在其他地方被定义为原始类型.