Ⅰ 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。