Ⅰ c语言 库函数的实现
C语言的库函数大多数是用C语言编的,只有少数与硬件有直接联系的核心部分才用汇编.
所谓库函数并不深奥,库函数也是由一个一个函数(子程序)组成的,如同我们自己程序里,有时也写很多子程序.
如果我们把一些可以反复使用的子程序拿出来,集中到一起,编译成一个my.obj文件,今后写新程序时我们不另写这些子程序,我们只写子程序的调用语句,编译时链结my.obj就可以了.当然,新程序的main()前面要有这些被调函数(子程序)的"原型"声明.
my.obj加上它里面的函数"原型"声明,就构成了库函数.函数"原型"声明就是这个库的"头"文件-- my.h, 这就是静态链结库.
自己也可以写动态链接库,动态链接库包括.DLL,.LIB,.H
自己写的静态链结库和动态链接库也可给别人用.就象C语言的库函数给你用一样.当你给别人时,你如果不给你写的C的函数,别人也"看不到了",别人只能查头文件,得知函数名,参数个数和类型.
Ⅱ c语言标准库是怎么写的比如要写一个printf函数,c语言能实现
你会发现,有一些头文件(比如stdlib.h,stdio.h)每一个编译器都有,而里面的函数(如printf,malloc)每一个编译器都支持。这些函数组成的集合就是标准函数库。平常用的函数基本都属于标准函数库。
ansi对此是有规定的
Ⅲ 求推荐有比较好的关于c标准库函数实现的资料的,讨论c语言性质,测试,使用的博客.
有一本书就叫做《C标准库》
可以去看看
网上也有电子版
Ⅳ 用C语言标准库实现文件操作
不知道。。。
Ⅳ 求:C语言的标准库函数实现原理的资料
看Linux库源码glibc 里面都有 正解
Ⅵ c语言的memset到底是怎么实现的 是c标准库里面写的这样么
memset在不同编译器里面实现方式是不一样的
不过 都要比你提供的几种要复杂 而且高效。
有些平台甚至是用汇编写的。
提供几种做参考:
void*__cdeclmemset(
void*dst,
intval,
size_tcount
)
{
void*start=dst;
#ifdefined(_M_IA64)||defined(_M_AMD64)
{
__declspec(dllimport)
voidRtlFillMemory(void*,size_tcount,char);
RtlFillMemory(dst,count,(char)val);
}
#else/*defined(_M_IA64)||defined(_M_AMD64)*/
while(count--){
*(char*)dst=(char)val;
dst=(char*)dst+1;
}
#endif/*defined(_M_IA64)||defined(_M_AMD64)*/
return(start);
}
#include<linux/types.h>
#include<asm/string.h>
#defineOPSIZ(BITS_PER_LONG/8)
typedefunsignedlongop_t;
void*
memset(void*dstpp,intsc,size_tlen)
{
unsignedintc=sc;
longintdstp=(longint)dstpp;
if(len>=8)
{
size_txlen;
op_tcccc;
cccc=(unsignedchar)c;
cccc|=cccc<<8;
cccc|=cccc<<16;
if(OPSIZ>4)
/*.*/
cccc|=(cccc<<16)<<16;
/*Thereareatleastsomebytestoset.
NoneedtotestforLEN==0inthisalignmentloop.*/
while(dstp%OPSIZ!=0)
{
((unsignedchar*)dstp)[0]=c;
dstp+=1;
len-=1;
}
/*Write8`op_t'periterationuntillessthan8`op_t'remain.*/
xlen=len/(OPSIZ*8);
while(xlen>0)
{
((op_t*)dstp)[0]=cccc;
((op_t*)dstp)[1]=cccc;
((op_t*)dstp)[2]=cccc;
((op_t*)dstp)[3]=cccc;
((op_t*)dstp)[4]=cccc;
((op_t*)dstp)[5]=cccc;
((op_t*)dstp)[6]=cccc;
((op_t*)dstp)[7]=cccc;
dstp+=8*OPSIZ;
xlen-=1;
}
len%=OPSIZ*8;
/*Write1`op_t'.*/
xlen=len/OPSIZ;
while(xlen>0)
{
((op_t*)dstp)[0]=cccc;
dstp+=OPSIZ;
xlen-=1;
}
len%=OPSIZ;
}
/*Writethelastfewbytes.*/
while(len>0)
{
((unsignedchar*)dstp)[0]=c;
dstp+=1;
len-=1;
}
returndstpp;
}
CODESEG
extrn_VEC_memzero:near
extrn__sse2_available:dword
publicmemset
memsetproc
dst:ptrbyte,
value:byte,
count:dword
OPTIONPROLOGUE:NONE,EPILOGUE:NONE
.FPO(0,3,0,0,0,0)
movedx,[esp+0ch];edx="count"
movecx,[esp+4];ecxpointsto"dst"
testedx,edx;0?
jzshorttoend;ifso,nothingtodo
xoreax,eax
moval,[esp+8];thebyte"value"tobestored
;
testal,al;memsetusingzeroinitializer?
jnedword_align
cmpedx,0100h;blocksizeexceedssizethreshold?
jbdword_align
cmpDWORDPTR__sse2_available,0;SSE2supported?
jedword_align
jmp_VEC_memzero;usefastzeroSSE2implementation
;noreturn
;Alignaddressondwordboundary
dword_align:
pushedi;preserveedi
movedi,ecx;edi=destpointer
cmpedx,4;ifit'slessthen4bytes
jbtail;
negecx
andecx,3;ecx=#bytesbeforedwordboundary
jzshortdwords;jumpifaddressalreadyaligned
subedx,ecx;edx=adjustedcount(forlater)
adjust_loop:
mov[edi],al
addedi,1
subecx,1
jnzadjust_loop
dwords:
;setall4bytesofeaxto[value]
movecx,eax;ecx=0/0/0/value
shleax,8;eax=0/0/value/0
addeax,ecx;eax=0/0val/val
movecx,eax;ecx=0/0/val/val
shleax,10h;eax=val/val/0/0
addeax,ecx;eax=all4bytes=[value]
;Setdword-sizedblocks
movecx,edx;moveoriginalcounttoecx
andedx,3;prepareinedxbytecount(fortailloop)
shrecx,2;adjustecxtobedwordcount
jztail;jumpifitwaslessthen4bytes
repstosd
main_loop_tail:
testedx,edx;ifthereisnotailbytes,
jzfinish;wefinish,andit'stimetoleave
;Setremainingbytes
tail:
mov[edi],al;setremainingbytes
addedi,1
subedx,1;ifthereissomemorebytes
jnztail;continuetofillthem
;Done
finish:
moveax,[esp+8];returndestpointer
popedi;restoreedi
ret
toend:
moveax,[esp+4];returndestpointer
ret
memsetendp
end
Ⅶ c语言标准库的目的是什么
C语言标准库的目的就是实现了一些常用的子程序功能,方便编程人员直接使用。比如数学库,里面就有常用的数学计算函数,方便我们直接调用,因为数学计算的形式是固定的,这样就不用程序员们每次都在重新的编写了,还有标准输入输出库,在里面有我们常用的C语言函数printf(),如果自己用汇编语言或者api去实现的话会很麻烦的。总之标准库的目的就是供程序员共享常用的函数集合,不用做无用功。
Ⅷ 求C语言标准函数库的源代码
标准库只是定义接口,具体怎么实现就得看操作系统,你说win下和linux下这些函数的实现会一样吗。当然不一样,看这些学源码,不如看看c标准,c89或c99.
那可以看内核,看系统调用是怎么样实现的,你说的那些都是基于系统调用的
Ⅸ 如何看c语言标准库函数的源代码
1、首先标准只是规定了这些函数的接口和具体的运行效率的要求,这些函数具体是怎么写得要看各个编译器的实现和平台。
2、例如使用的编译器是visual studio,微软提供了一部分C运行时(CRT)的源码,里面会有memcpy,strcpy之类的函数的实现,在visual studio 2005下的路径是C:Program FilesMicrosoft Visual Studio 8VCcrtsrc。
Ⅹ 在哪里可以找到C语言标准库的实现源代码
Linux下的glic库的源码链接:
http://ftp.gnu.org/gnu/glibc/,你可以下载最新版本的glibc-2.24.tar.gz这个压缩文件,在Windows系统下直接用WinRAR解压即可,如果在Linux系统下用命令行解压的话,命令如下:tar -xzvf glibc-2.24.tar.gz。