win32应用程序不是那么面向对象,为什么有这么多指针?

时间:2010-02-25 15:04:08

标签: c++ c winapi

对于你们中的一些人来说这可能是一个愚蠢的问题,也许我对这个问题提出了错误,因为我是c ++的新手。但是我注意到在使用很多win32应用程序时,你会使用大量的指针资源。为什么必须总是获取对象指针?为什么不发起一个新的类实例。说到这一点,我注意到在大多数情况下你永远不会发起新对象,但总是调用返回该指针的方法。如果该指针正在其他地方使用该怎么办?如果改变那个指针并且它正在其他地方使用,你不能弄乱一些东西。

9 个答案:

答案 0 :(得分:25)

Windows API是为C语言设计的,它曾经是并且仍然是系统编程最常用的语言; C API是系统API的事实标准,为此,几乎所有其他语言都有一些方法可以调用外部C函数,因此编写C API有助于与其他语言兼容。

C API只需要一个简单的ABI,它几乎只包含用于函数的调用约定的定义(以及有关结构布局的内容)。相反,C ++和其他面向对象的语言需要复杂的ABI,它必须定义对象在内存中的布局,如何处理继承,如何布局vtable,如何传播异常,在哪里放置RTTI数据, ...此外,并非所有语言都是面向对象的,并且使用C ++与其他非面向对象语言一起考虑的API可能是一个真正的痛苦(如果你曾经使用过C语言的COM,你就知道我的意思了。)

顺便说一下,当最初设计Windows时,C ++在PC上并不是那么普及,并且C还没有使用所以:实际上,很大一部分Windows 3.11和许多应用程序都是仍然是用汇编写的,因为那个时代的内存和CPU限制很紧张;编译器也比现在更不聪明,尤其是C ++。在手工锻造装配通常是唯一解决方案的机器上,C ++开销实际上是不可接受的。

对于指针:Windows API几乎总是使用句柄,即不透明指针,以便能够在不影响现有应用程序的情况下更改每个资源的基本属性,并阻止应用程序乱用内部结构。如果窗口管理器用于在内部表示窗口的结构发生变化,则无关紧要:所有应用程序仅使用HWND,它总是具有指针的大小。您可能会认为这是某种PIMPL习语。

然而,Windows在某种程度上是面向对象的(参见例如整个“窗口类”概念,或者在更深层次上,NT内核的内部工作,这很大程度上基于“对象”概念),但它最基本的API,简单的C函数,不知何故隐藏这种OO性质。另一方面,shell在很多年后被设计,主要用C ++编写,它提供了一个真正面向对象的COM接口。

有趣的是,您可以在COM中看到在构建跨语言时必须面对的所有权衡,但仍然是C ++偏向于面向对象的界面:结果非常复杂,在某些方面很难看,并且在任何方面都不是很简单语言。相反,Windows API是简单的函数,通常更容易调用。

如果您对基于C ++ API的系统感兴趣,可以查看Haiku;就个人而言,这是其中一个方面因为我对该项目非常感兴趣。

顺便说一下,如果你要使用API​​进行Win32编程,你最好能得到一本好书,以适应这些“特殊性”和其他Win32习语。两个众所周知的是Rector-NewcomerPetzhold

答案 1 :(得分:7)

因为Win32 Api是用纯C编写的,而不是C ++。因此几乎任何语言的任何程序都可以调用这些API。

另外,没有简单的机制可以在不同的模块和不同的语言中使用对象。即你不能将C ++类导出到python。当然,有像OLE / COM这样的技术,但它们仍然写在简单的C上。它们有点复杂使用。

另一方面 - 对普通C函数的调用是标准化的。因此,您可以使用任何语言从DLL或静态库中调用例程。

答案 2 :(得分:5)

Win32旨在使用C语言而不是C ++ 这就是为什么你会看到定义的BOOL而不是bool的返回类型。例如 bool特定于C ++,在C中不存在。

对于Microsoft的面向对象的Win32包装器,请参阅MFC

从那时起,微软的一个新框架就是.Net框架 .Net框架虽然基于托管代码,但不是本机运行的。在Windows上进行GUI编程的最现代的方法是WPF甚至Silverlight。

最现代的非托管GUI编程方法仍然是使用MFC,尽管有些人仍然喜欢使用直接的Win32。

注意使用指针并不特定于C,它在C ++中仍然很常见。

答案 3 :(得分:4)

第一个原因是因为传递指针很便宜。指针在x86上为4个字节,在x64上为8个字节。虽然它指向的结构或类可以在内存中占用更多。因此实例化一个类意味着一次又一次地保留新的内存。这在速度和内存消耗POV方面效率不高。

另一种方法是传递对象或智能指针或类似结构的引用。但是win32 api是在C时代设计的,所以这就是现在的地方;)

关于搞乱指针的可能性 - 当然可能。但大部分时间他们的生命周期都在API中明确说明(如果不是很明显)。

答案 4 :(得分:1)

可能因为Win32 API比主流的面向对象编程“更老”,它的核心并不是C ++ API。

答案 5 :(得分:0)

它几乎就像你应该尝试其中一个OO包装器。像MFC或.net。

答案 6 :(得分:0)

Windows API是普通的旧C,因此无处不在使用指针。此外,您向Windows询问新指针的原因是因为Windows需要跟踪所有对象...它会分配内容并告诉您一个指针(有时只是一个数字ID),以便您使用它们。

答案 7 :(得分:0)

  • 将C函数作为API允许C和C ++程序员使用它。
  • Windows API又回归了--C在那些日子里很有名。

所有HWND,HANDLE,HDC只是一种弱的尝试,无法制作类似于对象的数据类型(使用struct)。 C FAQ对此有疑问 - > http://c-faq.com/struct/oop.html

答案 8 :(得分:-3)

要理解您可能想要阅读的指针the CPlusPlus.com tutorial on pointers