my_fread明显是自己写的函数,int fread 是库提供的函数,其实就是别人写好的函数,你可以直接使用。具体的功能,库函数实现的功能是一定的,比如说atoi 就是实现将字符串转为整形,printf就是在屏幕上实现输出。非库函数的函数所完成的功能,要具体看代码里是怎么实现的。比如说printf,在嵌入式里常被从写为用作从串口打印输出数据, 而不是标准库里的屏幕输出。但功能都是为了输出,看到数据,用作调试。
如果还不明白,那么下面的代码第一个my_fread什么功能都没有完成,而第二个的功能和库函数fread 的功能完全一样,用于从文件读取数据。
size_t my_fread(void ptr,size_t size,size_t nmemb,FILE stream)
{
return 0;
}
size_t my_fread(void ptr,size_t size,size_t nmemb,FILE stream)
{
int fread(void ptr,int size,int count,FILE stream);
}
所以,函数名字并不代表什么哦,具体要看代码的实现,即函数的内容。windows编程只提供函数名字供你使用,也称为接口,而具体实现的方式,即函数的内容你是看不到的,就像标准库函数一样,他会告诉你这个接口怎么用,完成什么功能,但不会像库函数一样,让你看到具体的代码,都是封装起来的。而linux源码开放就是说你不仅可以使用,还可以看到这些函数具体的实现,具体的内容。
API函数是针对 *** 作系统的,C语言运行时函数则是针对C语言本身的
运行时库就是 C run-time library,是C而非C++语言世界的概念:取这个名字就是因为你的C程序运行时需要这些库中的函数
C语言是所谓的“小内核”语言,就其语言本身来说很小(不多的关键字,程序流程控制,数据类型等);所以,C语言内核开发出来之后,Dennis Ritchie和Brian Kernighan就用C本身重写了90%以上的UNIX系统函数,并且把其中最常用的部分独立出来,形成头文件和对应的LIBRARY,Crun-time Library就是这样形成的。
随后,随着C语言的流行,各个C编译器的生产商/个体/团体都遵循老的传统,在不同平台上都有相对应的Standard Library,但大部分实现都是与各个平台有关的。由于各个C编译器对C的支持和理解有很多分歧和微妙的差别,所以就有了ANSI C;ANSI C(主观意图上)详细的规定了C语言各个要素的具体含义和编译器实现要求,引进了新的函数声明方式,同时订立了Standard Library的标准形式。所以C运行时库由编译器生产商提供。至于由其他厂商/个人/团体提供的头文件和库函数,应当称为第三方C运行库(Third party C runtime libraries)
C run-time library里面含有初始化代码,还有错误处理代码(例如divide by zero处理)。你写的程序可以没有math库,程序照样运行,只是不能处理复杂的数学运算,不过如果没有了C run-time库,main()就不会被调用,exit()也不能被响应。因为C run-time Library包含了C程序运行的最基本和最常用的函数。
到了C++世界里,有另外一个概念:Standard C ++ Library,它包括了上面所说的C run-time Library和STL。包含C run-time Library的原因很明显,C++是C的超集,没有理由再重新来一个C++ run-time LibraryVC针对C++加入的Standard C ++ Library主要包括:LIBCPLIB,LIBCPMTLIB和MSVCPRTLIB
Windows环境下,VC提供的 C run-time Library又分为动态运行时库和静态运行时库
如果你能找到你的编译器的库文件放在哪里,那么只要把你的自己编写的函数放在编译器的库函数的文件中,直接引用就可以。
但是很多编译器的库函数是不开放的,你很难找到库函数的文件在哪。
因此,你只能把自己写的函数电脑的某个盘里,如d:\\盘,引用的时候直接引用就行。比如,自己写个文件(myfileh)放在 d
盘,即路径为 d:\\myfileh
举个例子:
1把myfileh文件放在d盘
可以新建一个记事本文件(后缀txt),把文件名改为(myfileh),在该文件中添加如下内容:
// myfileh 自定义一个的输出 图行的文件,相当于库函数
#include <stdioh>
void Display_San(int n) //打印三角形
{
int i;
for(i=0; i<n; i++)
{
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
}
}
void Display_Si(int n) //打印矩形
{
int i;
for(i=0; i<n; i++)
{
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
printf(" \n");
}
}
//还可以有更多的函数放在一个文件中,成了自定义的库函数
2在主函数中,引入该文件:
#include "d:\\myfileh" //引入自定义的文件,该文件包含两个函数(即自定义的库函数)
void main()
{
Display_San(2); //在d:\\myfileh文件中定义了
Display_Si(3); //在d:\\myfileh文件中定义了
}
这就成了引用库函数了!!!!!!
1、不同的系统开发函数库的具体步骤是不一样的,这主要决定于编译、链接环境。
2、不同的库开发方式也不一样,现在主流的库开发有两种,一种是静态库,一种是动态库,两者的本质区别是库代码是否和程序融合在一起,如果组装在一起就是静态库,如果不组装在一起,即为动态库,现在 *** 作系统提供的多数是动态库,如Linux平台的so文件,windows平台的DLL文件。
3、以Windows平台为例,用户可以通过Vc/vs等IDE集成开发环境,生成DLL工程,然后编写def文件进行导出。
C源程序是由函数组成的。
C程序是由一组或是变量或是函数的外部对象组的。 函数是一个自我包含的完成一定相关功能的执行代码段。
从函数定义的角度看,函数可分为库函数和用户定义函数两种。
1)库函数
由C系统提供,用户无须定义, 也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。在前面各章的例题中反复用到printf 、 scanf 、 getchar 、putchar、gets、puts、strcat等函数均属此类。
(2)用户定义函数
由用户按需要写的函数。对于用户自定义函数, 不仅要在程序中定义函数本身, 而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。
2 C语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。
(1)有返回值函数
此类函数被调用执行完后将向调用者返回一个执行结果, 称为函数返回值。如数学函数即属于此类函数。 由用户定义的这种要返回函数值的函数,必须在函数定义和函数说明中明确返回值的类型。
(2)无返回值函数
此类函数用于完成某项特定的处理任务, 执行完成后不向调用者返回函数值。这类函数类似于其它语言的过程。 由于函数无须返回值,用户在定义此类函数时可指定它的返回为“空类型”, 空类型的说明符为“void”。
3 从主调函数和被调函数之间数据传送的角度看又可分为无参函数和有参函数两种。
(1)无参函数
函数定义、函数说明及函数调用中均不带参数。 主调函数和被调函数之间不进行参数传送。 此类函数通常用来完成一组指定的功能,可以返回或不返回函数值。
(2)有参函数
也称为带参函数。在函数定义及函数说明时都有参数, 称为形式参数(简称为形参)。在函数调用时也必须给出参数, 称为实际参数(简称为实参)。 进行函数调用时,主调函数将把实参的值传送给形参,供被调函数使用。
4 C语言提供了极为丰富的库函数, 这些库函数又可从功能角度作以下分类。
(1)字符类型分类函数
用于对字符按ASCII码分类:字母,数字,控制字符,分隔符,大小写字母等。
(2)转换函数
用于字符或字符串的转换;在字符量和各类数字量 (整型, 实型等)之间进行转换;在大、小写之间进行转换。
(3)目录路径函数
用于文件目录和路径 *** 作。
(4)诊断函数
用于内部错误检测。
(5)图形函数
用于屏幕管理和各种图形功能。
(6)输入输出函数
用于完成输入输出功能。
(7)接口函数
用于与DOS,BIOS和硬件的接口。
(8)字符串函数
用于字符串 *** 作和处理。
(9)内存管理函数
用于内存管理。
(10)数学函数
用于数学函数计算。
(11)日期和时间函数
用于日期,时间转换 *** 作。
(12)进程控制函数
用于进程管理和控制。
(13)其它函数
用于其它各种功能。
函数可以避免重复的书写。比如一个运算要在不同的地方多次进行,就不必把这么多行都写一遍,调用一个函数就行了。同时减少不必要的变量。从而使程序大大简化。
库函数就比较高深了,它的好处我现在还没有切实体会到。
一般没什么区别,多数库函数实际上一般最终都是通过系统调用实现的,另外那些库函数完成字符串比较等功能,你自己也可以编写。
使用系统调用的好处在于,不增加可执行程序的大小,即使你把系统的功能调用完,你的程序也不大。
使用系统调用的另外一个好处,以后换其它语言写程序也能很快得心应手。
1、系统调用和库函数的关系
系统调用通过软中断int 0x80从用户态进入内核态。
函数库中的某些函数调用了系统调用。
函数库中的函数可以没有调用系统调用,也可以调用多个系统调用。
编程人员可以通过函数库调用系统调用。
高级编程也可以直接采用int 0x80进入系统调用,而不必通过函数库作为中介。
如果是在核心编程,也可以通过int 0x80进入系统调用,此时不能使用函数库。因为函数库中的函数是内核访问不到的。
2、从用户调用库函数到系统调用执行的流程。
1) 假设用户调用ssize_t write (int fields, cont void buff, size_t nbytes);库函数。
2) 库函数会执行int 0x80中断。因为中断使得进程从用户态进入内核态,所以参数通过
寄存器传送。
3) 0x80中断对应的中断例程被称为system call handler。其工作是:
i 存储大多数寄存器到内核堆栈中。这是汇编代码写的。
ii 执行真正的系统调用函数――system call service routine。这是C代码。
iii 通过ret_from_sys_call ()返回,回到用户态的库函数。这是汇编代码。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)