什么是C语言标准函数库?平常用的哪些函数属于标准函数库?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是C语言标准函数库?平常用的哪些函数属于标准函数库?相关的知识,希望对你有一定的参考价值。

什么是C语言标准函数库?平常用的哪些函数属于标准函数库?

你会发现,有一些头文件(比如stdlib.h,stdio.h)每一个编译器都有,而里面的函数(如printf,malloc)每一个编译器都支持。这些函数组成的集合就是标准函数库。平常用的函数基本都属于标准函数库。
ANSI对此是有规定的
参考技术A 楼上说的不是很准确,C语言标准函数库不是跟编程软件相关的。C语言的标准变化了好几次,现在说的标准C语言指的是99年制定的C99标准。其中定义的函数库就是C语言标准函数库。具体有哪些你可以查询《C语言参考手册(C:A Reference Manual,Fifth Edition》。
但事实上,每个C/C++编译器都带有自身的函数库,一般都兼容C标准函数库,但也有个别的有些细节上的出入。所以,一般你只要考察你所用编译器的函数库就行了(通常都可以从帮助中得到)。
参考技术B 要看你是用什么版本的C (如TC\ VC... )
C语言标准函数库就是这些编程软件本身自带的常用的函数库.
常见的如math.h 等等本回答被提问者采纳
参考技术C 想想你自己定义的函数,如过你定义了一些函数,就可以看成你制作了一个函数库,只不过你的函数都在程序上,所以不需要包含头文件,如过把你自己定义的函数做成.h文件,就可以在主程序中直接调用 参考技术D 标准库函数是由C标准委员会制定的,用于简化程序员的工作量, 他跟具体的编译器没有关系, 每个标准编译器都应该包括它们.

C的标准函数有很多,随着你学习的深入你会慢慢了解的

C语言为啥可以重写标准库函数?

就比如printf函数,里面使用了一个输出函数int fputc(int ch,FILE *f),然后就可以直接自己写一个相同名字的int fputc(int ch,FILE *f)函数,只是通过什么形式把数据输出就完全是自己实现的​.函数重名了编译器为什么不会报错?
这个问题我还是自己解决一下吧。这是编译器搞得事情。在MDK软件中使用
__attribute__ ( (weak))
语句就能让一个函数变成弱属性,如果有相同的函数名,但是没有加这个属性的话,就会采用这个函数了,而声明为弱属性的函数就不会被调用

这个问题是一个好问题,我之前也没思索过或者尝试过,
首先我们弄清楚一件事,函数声明可以放在任何头文件,实现可以放在任何实现该函数的源文件中,那么就存在一个问题:
编译时,到底优先去使用哪一个,为什么没有把标准库中的函数扩展过来;在windows下标准库被编译成了msvcr120.dll(msvcr100.dll,这里指release版),所以并不是扩展到代码中,而是在调用时动态链接;
而题主在其中自定义文件中实现了该函数,所以编译时找到了该函数的实现,并不会去链接dll(这应该是编译器做的一些工作,确定系统的dll需要加载哪些),所以题主的程序执行时就只有一份fputc了,并不冲突。
题主可以通过快捷键跳转声明就知道了,VS下,点选fputc实现函数按F12跳转到声明,指向的是stdio.h,再按一次跳转到你自己的定义了。Qt的话使用F2。
大概就是这样子了,可追问。追问

那么我们是不是也可以将一些函数编译成.dll的形式,然后就可以将这些函数进行重写,或者说在源码中还要进行特别申明这些函数可以被重写?

追答

首先说明一点,这个实际上不应该叫重写。
我们也可以将自己写的函数编译成dll,然后另写一个同样的实现函数。
若你在程序中使用到该函数,编译时就会去寻找实现,而在你的源文件中有一份实现,你觉得编译器还会去寻找另外一份实现吗,而且对于动态库,编译时并不会去寻找实现,而是在如动态链接库.lib文件中知道该函数是动态连接及其内存地址。
如你要写与dll中重名的函数,不需要特别声明,只需像通常写函数一样

参考技术A 你看了标准库的源码?追问

没有,只是需要重写一个fputc(),比较好奇。

追答

其实我没太明白你说的意思,能不能举具体代码例子

以上是关于什么是C语言标准函数库?平常用的哪些函数属于标准函数库?的主要内容,如果未能解决你的问题,请参考以下文章

C语言为啥可以重写标准库函数?

C语言库函数里有线性表基本操作函数吗?

c语言标准函数库的signal.h

在C中,啥是标准库函数?

STM32标准库函数是否所有的都能用

编程中系统允许对库函数重新定义吗?