c语言库函数是用什么写的 c语言库函数是什么意思

C语言库函数如何编写?/***
*printf.c - print formatted
*
* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines printf() - print formatted data
*
*******************************************************************************/
#include
#include
#include
#include
#include
#include
#include
/***
*int printf(format, ...) - print formatted data
*
*Purpose:
* Prints formatted data on stdout using the format string to
* format data and getting as many arguments as called for
* Uses temporary buffering to improve efficiency.
* _output does the real work here
*
*Entry:
* char *format - format string to control data format/number of arguments
* followed by list of arguments, number and type controlled by
* format string
*
*Exit:
* returns number of characters printed
*
*Exceptions:
*
*******************************************************************************/
int __cdecl printf (
const char *format,
...
)
/*
* stdout ''PRINT'', ''F''ormatted
*/
{
va_list arglist;
int buffing;
int retval;
va_start(arglist, format);
_ASSERTE(format != NULL);//断言宏 。如果输出格式字符串指针为空,则在DEBUG版下断言 , 报告错误 。
_lock_str2(1, stdout);
buffing = _stbuf(stdout);//stdout:指定输出到屏幕
retval = _output(stdout,format,arglist);
_ftbuf(buffing, stdout);
_unlock_str2(1, stdout);
return(retval);
}
以上为printf()的源代码
1、从含有可选参数函数中获得可选参数 , 以及操作这些参数
typedef char *va_list;
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
假定函数含有一个必选参数和多个可选参数,必选参数声明为普通数据类型,且能通过参数名来获得该变量的值 。可选参数通过宏va_start、va_arg和va_end(定义在stdarg.h或varargs.h中)来进行操作 , 即通过设置指向第一个可选参数指针、返回当前参数、在返回参数后重新设置指针来操作所有的可选参数 。
va_start:为获取可变数目参数的函数的参数提供一种便捷手段 。设置arg_ptr为指向传给函数参数列表中的第一个可选参数的指针,且该参数必须是va_list类型 。prev_param是在参数列表中第一个可选参数前的必选参数 。
va_arg:返回由arg_ptr所指向的参数的值,且自增指向下一个参数的地址 。type为当前参数的类型,用来计算该参数的长度 , 确定下一个参数的起始位置 。它可以在函数中应用多次,直到得到函数的所有参数为止,但必须在宏va_start后面调用 。
va_end:在获取所有的参数后 , 设置指针arg_ptr为NULL 。
下面举例说明:
#include
#include
int average( int first, ... );
void main( void )
{
/* Call with 3 integers (-1 is used as terminator). */
printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );
/* Call with 4 integers. */
printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );
/* Call with just -1 terminator. */
printf( "Average is: %d\n", average( -1 ) );
}
int average( int first, ... )
{
int count = 0, sum = 0, i = first;
va_list marker;
va_start( marker, first ); /* Initialize variable arguments. */
while( i != -1 )
{
sum= i;
count;
i = va_arg( marker, int);
}
va_end( marker ); /* Reset variable arguments. */
return( sum ? (sum / count) : 0 );
}
返回值为:
Average is: 3
Average is: 8
Average is: 0
综上所述,在printf()函数中,可以只输出一个字符串 , 也可按照一定的形式输出含有多个可选参数的字符串信息 。因此,首先就要通过这些宏来获取所有的可选参数 。在上面的源码可以看出printf()中,只使用了宏at_start,将可选参数的首地址赋给了arglist 。
2、锁定字符串及输出字符串到屏幕
#define _lock_str2(i,s) _lock_file2(i,s)
void __cdecl _lock_file2(int, void *);
#define _unlock_str2(i,s) _unlock_file2(i,s)
void __cdecl _unlock_file2(int, void *);
int __cdecl _stbuf(FILE *);
void __cdecl _ftbuf(int, FILE *);
int __cdecl _output(FILE *, const char *, va_list);
在output函数中,读取格式字符串中的每一个字符,然后对其进行处理,处理方式根据每一个字符所代表的意义来进行,如:普通字符直接利用函数WRITE_CHAR(ch, charsout);输出到控制台 。
其中的主要部分是对转换说明符(d,c,s,f)的处理 , 现在将对其中的部分代码进行详细说明,这里只说明最基本的转换说明符,对这些须基本的转换说明符进行修饰的修饰符 , 程序中单独进行处理 。下面是函数output()(output.c)部分源代码:
case ST_TYPE:
//表示当前处理的字符的类型为转换说明符 。
...
switch (ch) {
//下面对参数的获取都是利用宏va_arg( va_list arg_ptr, type );来进行的 。
case ''c'': {
//从参数表中获取单个字符,输出到缓冲字符串中,此时,type=int
buffer[0] = (char) get_int_arg(argptr); /* get char to print */
text = buffer;
textlen = 1; /* print just a single character */
}
break;
case ''s'': {
//从参数表中获取字符串,输出到缓冲字符串中,此时,type=char*
int i;
char *p; /* temps */
text = get_ptr_arg(argptr);
...
}
break;
case ''w'': {
//对宽字符进行处理
...
} /* case ''w'' */
break;
...
case ''e'':
case ''f'':
case ''g'': {
//对浮点数进行操作
...
#if !LONGDOUBLE_IS_DOUBLE
/* do the conversion */
if (flagsFL_LONGDOUBLE) {
_cldcvt((LONGDOUBLE*)argptr, text, ch, precision, capexp);
va_arg(argptr, LONGDOUBLE);
//对长双精度型进行处理,此时,type=long double
}
else
#endif /* !LONGDOUBLE_IS_DOUBLE */
{
//对双精度型进行处理,此时,type=double
_cfltcvt((DOUBLE*)argptr, text, ch, precision, capexp);
va_arg(argptr, DOUBLE);
}
...
break;
//对整型变量处理
case ''d'':
case ''i'':
...
goto COMMON_INT;
case ''u'':
radix = 10;
goto COMMON_INT;
case ''p'':
...
goto COMMON_INT;
case ''o'':
...
注:对于浮点型double和long double , 有相应的转换说明符(%f表示双精度型 , %lf表示长双精度型) , 而float却没有 。其中的原因是 , 在KRC下,float值用于表达式或用作参数前,会自动转换成double类型 。而ANSI C一般不会自动把float转换成double 。有些程序已假定其中的float参数会被转换成double,为了保护大量这样的程序,所有printf()函数的float参数还是被自动转换成double型 。因此,在KRC或ANSI C下,都无需用特定的转换说明符来显示float型 。
综上所述,转换说明符必须与待打印字符的类型 。通常,用户有种选择 。例如,如要打印一个int类型的值 。则只可以使用%d,%x或%o 。所有这些说明符都表示要打印一个int类型的值;它们只不过提供了一个数值的几种不同表示 。类似一 , 可以用%f、%g和%e来表示double类型的值 。但如果转换说明与类型不匹配 , 将会出现意想不到的结果 。为什么呢?问题就在于C向函数传递信息的方式 。
这个失败的根本细节与具体实现相关 。它决定了系统中的参数以何方式传递 。函数调用如下:
float n1;
double n2;
long n3;
long n4;
...
printf("%ld,%ld,%ld,%ld",n1,n2,n3,n4);
这个调用告诉计算机 , 要把变量n1,n2,n3和n4的值交给计算机,它把这些变量放进称作栈(stack)的内存区域中,来完成这一任务 。计算机把这些值放进栈中,其根据是变量的类型而不是转换说明符,比如n1,把8个字节放入栈中(float被转换成double),类似地,为n2放了8字节,其后给n3和n4各放了4个字节 。接着,控制的对象转移到printf();此函数从栈中读数,不过在这一过程中 , 它是在转换说明符的指导下,读取数值的 。说明符%ld指定printf()应读4个字节(va_arg( va_list arg_ptr, type )中type=long),因此printf()读入栈中的4个字节,作为它的第一个值 。但是这只是n1的前半部分 , 这个值被看成一个long整数 。下一个说明符%ld读入4个字节,这正是n1的后半部分,这个值被看成第二个long整数 。类似地,第三、第四次又读入n2的前后两部分 。因此,尽管我们对n3和n4使用了正确的说明符 , printf()仍然会产生错误 。
C语言中什么是库函数?库函数(Library function)是把函数放到库里 , 供别人使用的一种方式 。.方法是把一些常用到的函数编完放到一个文件里,供不同的人进行调用 。调用的时候把它所在的文件名用#include加到里面就可以了 。一般是放到lib文件里的 。
一般是指编译器提供的可在c源程序中调用的函数 。可分为两类,一类是c语言标准规定的库函数,一类是编译器特定的库函数 。
由于版权原因,库函数的源代码一般是不可见的,但在头文件中你可以看到它对外的接口
库函数简介 。
C语言的语句十分简单,如果要使用C语言的语句直接计算sin或cos函数 , 就需要编写颇为复杂的程序 。因为C语言的语句中没有提供直接计算sin或cos函数的语句 。又如为了显示一段文字,我们在C语言中也找不到显示语句,只能使用库函数printf 。
C语言的库函数并不是C语言本身的一部分,它是由编译程序根据一般用户的需要编制并提供用户使用的一组程序 。C的库函数极大地方便了用户,同时也补充了C语言本身的不足 。事实上,在编写C语言程序时,应当尽可能多地使用库函数,这样既可以提高程序的运行效率,又可以提高编程的质量 。
这里调用的是静态库 。
函数库:函数库是由系统建立的具有一定功能的函数的集合 。库中存放函数的名称和对应的目标代码,以及连接过程中所需的重定位信息 。用户也可以根据自己的需要建立自己的用户函数库 。
库函数:存放在函数库中的函数 。库函数具有明确的功能、入口调用参数和返回值 。
连接程序:将编译程序生成的目标文件连接在一起生成一个可执行文件 。
头文件:有时也称为包含文件 。C语言库函数与用户程序之间进行信息通信时要使用的数据和变量,在使用某一库函数时 , 都要在程序中嵌入(用#include)该函数对应的头文件 。
由于C语言编译系统应提供的函数库尚无国际标准 。不同版本的C语言具有不同的库函数,用户使用时应查阅有关版本的C的库函数参考手册 。我们以Turbo C为例简介一下C的库函数,并附录中给出了Turbo C的部分常用库函数 。
c语言的库函数(尤其是与硬件联系的函数)是谁编出来的,是用汇编语言编的吗??printf函数的原型是什么呢库函数是做编译器的人写出来的,也是用C写出来的,库函数不属于C语言的一个部分,是人们为了使C用来写程序时效率更高 , 而预先写好的函数 , 其实你也可以自己写的 。
printf(char *format,arg1,arg2,...),使用了可变长参数表
c语言的库函数是谁编写的?计算机语言和计算机操作系统是两个层面上c语言库函数是用什么写的的东西 。
C(包括C)是贝尔实验室开发的,其所属公司ATT公司早已倒闭,所以已经是没有爹娘的孩子 , 根本没有什么标准化组织 。现在主要的两个C语言标准c语言库函数是用什么写的:C89和C99都是各个厂商实现各自的C,经过市场竞争以后形成的事实标准,后经ANSI(美国国家标准化委员会)认定所形成的美国标准 , 继而又被ISO组织采纳为事实标准 。
有标准以后各个厂商按照标准修改自己的产品,有的还提供各种选项供用户选择使用何种标准(如VC工程属性里的各种设置),以实现“源程序级兼容” 。
C中各种函数,如printf函数,涉及到操作系统界面,在不同平台上的实现肯定是不一样的 。stdio.h,conio.h在硬盘上都有确实的文件的 , 可以打开看看函数的定义,都是一些#define之类的 。具体实现功能的东西在.obj,.lib这些文件里面 , 有部分是用汇编写的,全部都是没有源代码的 。但是其他的通用函数可能是一样的 , 比如CSTL,都是HP和SGI的标准版 。
linux开源,开得是linux的源,当然不包括库函数 。
【c语言库函数是用什么写的 c语言库函数是什么意思】操作系统的API,全称application programming interface,即"应用程序接口" , 是操作系统提供的功能,操作系统将硬件裸机包装成虚拟机,提供多种接口供用户调用 。Linux、Windows的API是基于C、C的,DOS的API是基于汇编语言的 。
既然C是接近硬件的语言,只要不违反操作系统的安全性、稳定性等限制,大可以跳开API直接操作硬件 。这样无异于自己编写操作系统,所以C语言如果真的有楼主所述“只用这些函数就能解决问题”这一天,那么那个时候的C语言就已经发展成为操作系统了 。
怎么在c语言中自己写库函数1、不同的系统开发函数库的具体步骤是不一样的,这主要决定于编译、链接环境 。
2、不同的库开发方式也不一样 , 现在主流的库开发有两种,一种是静态库,一种是动态库,两者的本质区别是库代码是否和程序融合在一起,如果组装在一起就是静态库 , 如果不组装在一起,即为动态库 , 现在操作系统提供的多数是动态库,如Linux平台的.so文件 , windows平台的DLL文件 。
3、以Windows平台为例,用户可以通过Vc/vs等IDE集成开发环境 , 生成DLL工程,然后编写def文件进行导出 。
c语言库函数是用c语言编写的还是汇编语言?有些是用汇编语言写c语言库函数是用什么写的的,如直接控制硬件c语言库函数是用什么写的的函数.
有些是用C编写c语言库函数是用什么写的的,如字符串的处理函数等.
c语言库函数是用什么写的的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言库函数是什么意思、c语言库函数是用什么写的的信息别忘了在本站进行查找喔 。

    推荐阅读