一个新手关于c/c++头文件以及编译过程的疑惑

1. 标准库一般是有源码的,你可以单步进去看它的实现。你想的总体上是对的,printf这种涉及外部设备的操作一般最终会归结为系统功能的调用,可以简单理解为使用了系统的dll。
而有些函数比如math.h里的只是用CPU功能的函数一般就是不依赖系统纯自己写的。
2. 可以做到,但是现实中可能没人那么干。每种编译器都有细节上的不同,而每个编译器配一套自己的标准库头文件是非常... 理智的。
3. 正常情况下是。如果你的Windows API是泛指Windows上的API的话,一般都是。如果只限CreateWindowEx的那个,那么建立窗口之后完全可以用D3D或者OpenGL渲染界面而不用传统的GDI。
4. 正常情况下是动态链接库(.so .dll)或者静态链接库(.a .lib)。这两个分别是系统和编译器替你实现的链接。而你大可自己折腾。另外C++的模板库只能以源文件形式存在。

■网友
1.
printf如何实现可以直接看源码;数据输出跟设备相关,比如终端、txt文本,底层一定会跟会调用系统提供的接口。stdio.h只是各种函数的声明,只有生成可执行文件时,即“链接”的时候,才“拿的”标准库的静态库,或动态库
2.
基本不能,比如c++里面的函数符号修饰方式是不同的,还有一些扩展不同
【一个新手关于c/c++头文件以及编译过程的疑惑】 3.
底层调的都是系统的api,谁让咱程序跑在人家操作系统上呢?
4.
dll是windows下的动态库,so是linux下的动态库
lib是windws下的静态库,a是linux下的静态库(本质上是目标文件的压缩)
粗略来讲,
动态库省空间,大家共同调用,如果动态库有更新(调用入口没有变),只需换了这个动态库,程序就能运行,不需要重新编译
静态库里面代码直接“合并”到可执行文件里面,运行时候就不需要这个库了

■网友
问题1:标准库里的一些函数是如何实现的?最简单的包含在stdio.h文件中的printf()函数,这个函数是如何实现的?是不是调用的windows 提供的dll?还是靠编译器实现?我是这么想的:stdio.h中,调用系统或是编译器提供的dll,并给出了printf的函数声明,在printf中调用windows api。不知道是不是这么回事?printf由编译器提供,叫c标准库。标准库实现的时候调用操作系统api。问题2:不同编译器的标准库头文件能不能通用。比如vs的stdio.h能不能在dev中用?或是在linux中用。一般不能,没试过。问题3:第三方提供的库是怎么是实现的?比如同样用mfc和qt做一个相同的界面,那么在这些第三方库提供的链接库中是不是都通过调用windows api 来实现界面?还是其他方式?第三方的库跟普通应用程序差不多,无非是调用api,调用标准库,调用其他第三方库实现,只不过一个是可以运行,一个做成库而已。问题4:windows的各种程序库都是以什么形式存在的?是不是都是dll或是lib?那Linux中呢?.so文件?dll是动态库,linux是so,区别于静态库,动态库是所有进程共享的。2种都是库。动态库节约内存,尤其是这个库被多个进程调用的时候。静态库也不是没有用处,好处之一是比动态库快。静态库是跟用户问题代码链接到一起的,放在一起加载,静态库调用的时候,偏移较少,短调用即可。而动态库放在操作系统地址空间,跟用户空间地址相差很大,只能用长调用。从缓存角度来说,静态库也更容易命中。
■网友
GNU的GCC编译器给出的头文件有GNU的扩展语法,比如包含了__attribute__, #include_future等关键词,在微软的cl编译器下编译是会报错的。
■网友
printf可以自己简单实现的 处理好格式符后用内联汇编int 0x80 进行write系统调用 就可以啦(针对linux,windows是 int 0x21?)操作系统课会讲的
■网友
谢邀。对编程一窍不通。私以为找一个老师会让你有很大的进步。


推荐阅读