2009-01-12 27 views
9

许多标准c库(fwrite,memset,malloc)函数在windows API(WriteFile,FillMemory/ZeroMemory,GlobalAlloc)中有直接的等价物。C库vs WinApi

除了可移植性问题,应该使用什么,CLIB或Windows API函数?

C函数会调用winapi函数还是相反?

感谢您的帮助

回答

15

C库没什么神奇的。它只是一个用于访问操作系统公共服务的标准API。这意味着它使用OS提供的API在OS之上实现。

在您的情况下使用任何有意义的。 C库是可移植的,Win32不是。另一方面,Win32通常更灵活,并且提供更多的功能。

3

这些函数并不等同于ZeroMemory等一些简单的东西。

GlobalAlloc例如为您提供内存,但它也用于win16下的共享内存传输。该功能的部分功能仍然存在。

WriteFile不仅会写入文件,还会写入(除其他外)命名管道。 fwrite或write的东西不能直接做。

如果可能的话,我会说使用c库函数,只有当您需要额外的功能或如果您得到性能改进时才使用windows函数。

这将使得移植到其他平台更容易。

1

C函数将调用系统API,标准运行时C库(或CRT)是用于在系统间标准化的API。

在内部,每个系统都使用系统调用或驱动程序直接设计自己的API。如果你有一个Visual C++的商业版本,它用来提供CRT源代码,这是有趣的阅读。

2

C函数会调用winapi函数还是相反?

C函数(在用户模式库中实现)调用WINAPI函数(在O/S内核中实现)。

+0

许多Winapi函数都在OS DLL中实现,这些DLL导致系统调用实际上是实现定义的并且未记录。 – Blaisorblade 2009-01-12 01:30:47

+0

某些调用(例如,文件系统驱动程序位于内核中的文件I/O)显然必须以O/S内核结束;而其他(例如,简单地将一定范围的用户模式存储器置零)不需要。 – ChrisW 2009-01-12 02:01:27

1

上一些实例中有几个附加分:

FillMemory,ZeroMemory

无论这些也不是C函数是系统调用,所以任一个可能在另一个的顶部来实现,或他们甚至可以有不同的实现,来自一个共同的源代码或不是。

的GlobalAlloc

由于malloc()函数是建立在通过其API提供的操作系统原语的顶部,它会如果malloc()和这种分配器直接使用愉快地共存没有问题有兴趣知道。我可以想象为什么malloc可能默默地认为它访问的堆是连续的,即使我称之为设计错误,即使它被记录下来,除非安全性的额外成本是无关紧要的。

2

如果您要将应用程序移植到多个平台上,我会说您应该创建自己的一套包装,即使您使用标准C函数。这将为您提供切换平台时的最佳灵活性,因为您的代码将以更好的方式与底层系统隔离。

当然,这意味着如果您只打算为Windows平台编程,那么只需使用Windows功能,并且不要使用相同类型的标准C库函数。

最后你只需要保持与你的选择一致,你会没事的。

3

它可能比您要查找的信息更多(也可能不是您要求的),但Catch22.net有一篇文章,标题为“Techniques for reducing Executable size”,可能有助于指出Win32 API调用和c运行时调用的差异。

-1

那么,我目前正试图避免包括fstream,sstream,iostream和许多C标准库文件,并使用winAPI代替,因为包括这些库中的任何一个都会将输出可执行文件的大小从大约10 KB增加到大约500 KB 。 但有时候最好使用C标准库来使代码跨平台。 所以我认为这取决于你的目标。