当前位置:首页 » 编程语言 » c语言标准库的实现
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言标准库的实现

发布时间: 2022-02-14 17:28:25

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。