當前位置:首頁 » 編程語言 » 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。