C++ C库与WinApi

C++ C库与WinApi,c++,c,winapi,visual-c++,C++,C,Winapi,Visual C++,许多标准c库(fwrite、memset、malloc)函数在Windows Api中有直接等价物(WriteFile、FillMemory/ZeroMemory、GlobalAlloc) 除了可移植性问题外,应该使用什么,CLIB或Windows API函数 C函数将调用Windows Api函数,还是相反 C库没有什么神奇之处。它只是从操作系统访问公共服务的标准化API。这意味着它是在操作系统之上实现的,使用操作系统提供的API 在你的情况下使用任何有意义的方法。C库是可移植的,Win32不

许多标准c库(fwrite、memset、malloc)函数在Windows Api中有直接等价物(WriteFile、FillMemory/ZeroMemory、GlobalAlloc)

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


C函数将调用Windows Api函数,还是相反

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


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

除了一些简单的东西,如ZeroMemory,这些功能实际上并不等同

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

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

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


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

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

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


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

关于一些示例,还有几点需要说明:

填充内存,零内存

这些函数和C函数都不是系统调用,因此其中一个函数可能是在另一个函数之上实现的,或者它们甚至可能有不同的实现,不管它们是否来自同一个源

球状


由于malloc()是在其API公开的操作系统原语之上构建的,因此了解malloc()和此类分配器的直接使用是否能够顺利共存将是一件有趣的事情。我可能会想到一些原因,为什么malloc会默默地假设它访问的堆是连续的,即使我会称之为设计缺陷,即使它被记录在案,除非安全方面的额外成本不是微不足道的。

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

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


最后,你只需要与你的选择保持一致,你就会好起来。

这可能比你要寻找的信息要多(可能不是你所要求的),但是Catch22.net有一篇题为“”的文章,可能有助于指出Win32 api调用和c运行时调用之间的差异

嗯,我目前正试图避免包含fstream、sstream、iostream和许多C标准库文件,而是使用WinAPI,因为包含这些库中的任何一个都会将输出可执行文件的大小从大约10KB增加到大约500KB。 但有时最好使用C标准库使代码跨平台。
因此,我认为这取决于您的目标。

许多Winapi函数都是在操作系统DLL中实现的,这导致系统调用实际上是实现定义的,并且没有文档记录。一些调用(例如文件I/O,文件系统驱动程序在内核中)显然必须在O/S内核中结束;而其他人(例如,简单地将一系列用户模式内存归零)则不需要。感谢链接。它涉及许多有趣的话题,包括关于这个话题的相关信息。