c++自带函数库中的函数,与windows API函数的关系是什么,是不是库函数在实际执行时也要调用windows api函数呀,即api函数才是最终能执行的函数?

kanzm 2008-12-21 08:30:47
c++自带函数库中的函数,与windows API函数的关系是什么,是不是库函数在实际执行时也要调用windows api函数呀,即api函数才是最终能执行的函数?
c/c++都自带了函数库,比如prinf,scanf都是自带函数库中的函数,但是这些库函数在执行时,是直接转成二进制去执行呀,还是转成windows api函数呢?

是不是所有库函数在实际执行时,都是转成windows api呀,这好象是个纯理论问题,但是弄不明白,不利于下一步学习,谢谢。
...全文
952 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilovedrv 2008-12-21
  • 打赏
  • 举报
回复
刚才有点错误,那个c库和c++库还是有不同的

c库 msvcr**.dll

c++库 msvcp**.dll

这个有好多版本,微软就是整天靠改名升级,呵呵

不过都由一个规律,就是c++库处理依赖于Kernel32.dll,还依赖于c库
ilovedrv 2008-12-21
  • 打赏
  • 举报
回复
c++自带函数库中的函数,与windows API函数的关系是什么,是不是库函数在实际执行时也要调用windows api函数呀,即api函数才是最终能执行的函数?

用Dependency查看msvcrt.dll依赖于 Kernel32.dll,而Kernel32.dll依赖于NTDLL.dll,这只说明c库依赖于系统提供的功能调用, 而api是不依赖于c库,那些依赖于
Kernel32.dll库的函数,很显然最终api才是实现


c/c++都自带了函数库,比如prinf,scanf都是自带函数库中的函数,但是这些库函数在执行时,是直接转成二进制去执行呀,还是转成windows api函数呢?

有些函数类似字符串处理 strcpy之类,肯定是独立实现,不依赖于api,但像fopen之类最终是调用了系统api函数CreateFile,不信你可以用ida查看一下调用关系图


是不是所有库函数在实际执行时,都是转成windows api呀,这好象是个纯理论问题,但是弄不明白,不利于下一步学习,谢谢。

不知道楼主说必须弄清这个,否则不利于学习,我的建议是能用c库实现的,绝不用api,用c库可以跨平台
Amuro1987218 2008-12-21
  • 打赏
  • 举报
回复
库在不同平台有供应商实作,那取决于他们如何实现。
目前来说,很多api还是要走WINAPI
jingzhongrong 2008-12-21
  • 打赏
  • 举报
回复
并不一定需要谁调用谁。
我上面说过了,比如字符串、内存操作系列的函数,可以直接使用汇编来实现,而且保证效率。
类似fopen这类的函数,只能调用操作系统提供的接口,无论是在windows下或者是linux下,fopen都能保证实现相同的功能,虽然操作系统不同。由于事实上是调用了系统API,调用过程中运行库多出了各种消耗,如参数检查、函数堆栈保存、恢复等,效率会比直接调用API稍低。
野男孩 2008-12-21
  • 打赏
  • 举报
回复
标准运行库是对操作系统调用的封装,目标是提供可移植的代码.

#include <stdio.h>

int main(int argc, char** argv)
{
FILE* fp = fopen(filename, "rb");
fclose(fp);
return 0;
}

像这样的代码,在windows/linux下面都能正常编译。尽管在不同的os下,文件操作的接口是不一样的。
就是因为runtime library提供了对操作系统层次的封装。
kanzm 2008-12-21
  • 打赏
  • 举报
回复
这两种函数,哪一个更底层呢?
关键是谁调用谁的问题。
kanzm 2008-12-21
  • 打赏
  • 举报
回复
我想问的是,标准库函数与api函数是平行的关系呢?还是上下级的关系。
同样的功能,是不是分别用库函数与api函数都可以实现呢?如果都能实现的话,哪种方法效率更高,更优化呢?
如果不是平行的关系,那就是依存的关系,即库函数可以越过api函数自已实现某些功能吗?

即二者是平行的,还是上下级的,还是二种关系都有,谢谢。
bdzwj 2008-12-21
  • 打赏
  • 举报
回复
应该是部分需要调用API的,比如和操作系统相关的一些操作
jingzhongrong 2008-12-21
  • 打赏
  • 举报
回复
API是操作系统的编程接口

比如字符串操作函数、内存操作函数就可以不依靠操作系统API实现。
又比如文件操作函数,最终需要访问硬件的函数,在保护模式下访问硬件是受到限制的,因此需要调用系统API来实现
用户 昵称 2008-12-21
  • 打赏
  • 举报
回复
api就是个“接口”,底层的具体实现是一样的,c++要调用底层实现,api也是调用底层实现。
北京的雾霾天 2008-12-21
  • 打赏
  • 举报
回复
应该不是这样的。C++是可以直接操作硬件的。当然C++是可以调用系统API的。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧