c語言怎么寫出庫函數(shù),c庫函數(shù)實現(xiàn)

怎么在c語言中自己寫庫函數(shù)

1、不同的系統(tǒng)開發(fā)函數(shù)庫的具體步驟是不一樣的,這主要決定于編譯、鏈接環(huán)境。

站在用戶的角度思考問題,與客戶深入溝通,找到瀍河網(wǎng)站設(shè)計與瀍河網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、主機域名、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋瀍河地區(qū)。

2、不同的庫開發(fā)方式也不一樣,現(xiàn)在主流的庫開發(fā)有兩種,一種是靜態(tài)庫,一種是動態(tài)庫,兩者的本質(zhì)區(qū)別是庫代碼是否和程序融合在一起,如果組裝在一起就是靜態(tài)庫,如果不組裝在一起,即為動態(tài)庫,現(xiàn)在操作系統(tǒng)提供的多數(shù)是動態(tài)庫,如Linux平臺的.so文件,windows平臺的DLL文件。

3、以Windows平臺為例,用戶可以通過Vc/vs等IDE集成開發(fā)環(huán)境,生成DLL工程,然后編寫def文件進行導出。

求一個只用c語言編寫的倉庫管理系統(tǒng)

#includestdio.h

#includestdlib.h

#includestring.h

#includemalloc.h

#define?max?32

int?ifempty=0;//標志,判斷鏈表是無否為空

typedef?struct?dnode?/*?定義雙向鏈表結(jié)構(gòu)體?*/?

{

int?number;?/*?貨物編號?*/

char?name[max];?/*?貨物名稱?*/?

int?counter;?/*?貨物數(shù)量?*/

struct?dnode?*prior,?*next;

/*?定義兩指針,分別指向其前驅(qū)和后繼?*/

}dlnode;?

dlnode?*create(dlnode?*L);

dlnode?*input(dlnode?*L);

dlnode?*output(dlnode?*L);

dlnode?*?outnum(dlnode?*L);

dlnode?*?outname(dlnode?*L);

dlnode?*current(dlnode?*L);

void?search(dlnode?*L);

void?print(dlnode?*L);

void?searchnum(dlnode?*L);

void?searchname(dlnode?*L);

void?display(dlnode?*L)?;

void?main()

{

int?x;

dlnode?*L;

if(!(L=(dlnode?*)malloc(sizeof(dlnode))))?//分配空間

{

printf("\n");

exit(1);

}

create(L);///調(diào)用函數(shù),創(chuàng)建頭節(jié)點

while(1)

{////////////////////////主菜單///////////////////////////

printf("?============================\n");

printf("?1.?貨物出庫和入庫\n");

printf("?2.?查找貨物表\n");?

printf("?3.?顯示倉庫貨物表\n");

printf("?4.?輸出到文件\n");

printf("?0.?退出\n");

printf("?=============================\n");

printf("?選擇0--3:");

scanf("%d",x);

switch(x)

{

case?2:search(L);break;//調(diào)用查找函數(shù)

case?1:current(L);break;//調(diào)用入庫出庫函數(shù)

case?3:display(L);break;//調(diào)用顯示輸出函數(shù)

case?4:print(L);break;//調(diào)用打印函數(shù)

case?0:printf("\n?bye!see?you!\n");

getchar();getchar();exit(0);//退出程序

default:printf("\n?Enter?erreor!please?input?0--4!");?

getchar();getchar();

}

}

}

dlnode?*create(dlnode?*L)//創(chuàng)建鏈表頭節(jié)點

{

printf("?歡迎使用我的倉庫管理系統(tǒng)");

getchar();?

ifempty=0;

///////初始化頭節(jié)點的值////////

L-next=NULL;L-prior=NULL;

L-number=L-counter=0;

strcpy(L-name,"?");?

return?L;

}

void?search(dlnode?*L)?///查找的主要菜單

{

int?y;

if(ifempty==0)

{

printf("沒有輸入貨物!\n");

getchar();getchar();

return;

}

else

{

while(1)

{

printf("=====================\n");

printf("1.按編號查詢\n");

printf("2.按貨物名稱查詢\n");

printf("0.返回上一層\n");

printf("====================\n");

printf("選擇0--2:");

scanf("%d",y);

switch(y)

{

case?1:searchnum(L);break;//調(diào)用按編號查找的函數(shù)

case?2:searchname(L);break;//調(diào)用按名稱查找的函數(shù)

case?0:return;//返回

default:printf("enter?error!Please?input?0--2!\n\n");

getchar();getchar();printf("\n\n");

}

}

}

}

void?searchnum(dlnode?*L)///按編號查找的函數(shù)

{

int?num,flag=0;//flag為是否找到的標志

dlnode?*head=L;

if(ifempty==0)

{

printf("沒有貨物被輸入\n");

getchar();getchar();

return;

}

printf("輸入你要查找的貨物編號:\n");

scanf("%d",num);

while((L=L-next)!=head)

{

if(L-number==num)

{?flag=1;//flag為1時表示找到

printf("找到指定編號貨物?\n");?

printf("\n編號:%d\n",L-number);

printf("名稱:%s\n",L-name)?;

printf("數(shù)量:%d\n\n",L-counter);?

}?

}

if(flag==0)//flag為0時表示沒有找到

printf("沒有找到指定編號貨物,請查看是否還有貨物。\n");

getchar();getchar();

}

void?searchname(dlnode?*L)//按名稱查找的函數(shù)

{

int?flag=0;//flag為是否找到的標志

char?na[32];

dlnode?*head=L;

if(ifempty==0)

{

printf("沒有貨物被輸入\n");

getchar();getchar();

return;

}

printf("輸入你要查找的貨物名稱\n");

scanf("%s",na);

while((L=L-next)!=head)

{

if(strcmp(L-name,na)==0)

{?flag=1;//flag為1時表示找到

printf("找到指定名稱貨物?\n");?

printf("\n編號:%d\n",L-number);

printf("名稱:%s\n",L-name)?;

printf("數(shù)量:%d\n\n",L-counter);?

}?

}

if(flag==0)//flag為0時表示沒有找到

printf("沒有找到指定編號貨物,請查看是否還有貨物。\n\n");

getchar();getchar();

}

dlnode?*current(dlnode?*L)//貨物出庫入庫函數(shù)

{

int?y;

while(1)

{

printf("========================\n");

printf("?1.貨物入庫\n");

printf("?2.貨物出庫\n");

printf("?0.返回上一層\n");

printf("========================\n");

printf("?選擇0--2:");

scanf("%d",y);

switch(y)

{

case?1:input(L);break;//調(diào)用入庫函數(shù)

case?2:output(L);break;//調(diào)用出庫函數(shù)

case?0:return(L);//返回上一層

default:printf("enter?error!Please?input?0--2!");

getchar();getchar();

printf("\n\n");

}

}

}

dlnode?*input(dlnode?*L)//定義入庫函數(shù)

{

dlnode?*in,*head;

head=in=(dlnode?*)malloc(sizeof(dlnode));//分配空間

head=L;

printf("\n請輸入貨物數(shù)據(jù):\n");

printf("編號:");scanf("%d",in-number);

printf("名稱:");scanf("%s",in-name);

printf("數(shù)量:");scanf("%d",in-counter);

if(L-next==NULL)?//如果只有頭節(jié)點,

{?//把剛輸入的in節(jié)點

L-next=in;?//跟在頭節(jié)點后面

L-prior=in;?//

in-next=L;?//

in-prior=L;?//

ifempty++;?//ifempty加1

}

else

{//如果當前L的下一個節(jié)點不是頭節(jié)點

while((L=L-next)!=head)

{//如果輸入的數(shù)大于L-number,則插到L的前面

if(L-numberin-number)

{

in-next=L;

in-prior=L-prior;?

L-prior-next=in;

L-prior=in;

ifempty++;?//ifempty加1

return(head);

}?

}

//輸入的編號比其它編號都小,則插到最后個節(jié)點,并首尾相連

head-prior-next=in;

in-prior=head-prior;

head-prior=in;

in-next=head;

ifempty++;?//ifempty加1

}?

return?head;

}

dlnode?*output(dlnode?*L)//出庫的函數(shù)

{

int?y;

dlnode?*head=L;

if(ifempty==0)//檢測是否有貨物輸入

{

printf("沒有貨物輸入系統(tǒng)\n");

getchar();getchar();

return(head);

}?

while(1)

{

printf("=============\n");

printf("1.按編號出庫\n");

printf("2.按名稱出庫\n");

printf("0.返回上一層\n");

printf("==============\n");

printf("選擇0--2:");scanf("%d",y);

switch(y)

{

case?1:outnum(L);break;//調(diào)用按編號出庫函數(shù)

case?2:outname(L);break;//調(diào)用按名稱出庫函數(shù)

case?0:return(L);

default:printf("enter?error!Please?input?0--2!");

getchar();getchar();printf("\n\n");

}

}

}?

dlnode?*outnum(dlnode?*L)//按編號出庫函數(shù)

{?

int?num;

dlnode?*head=L;

printf("請輸入出庫貨物的編號:");

scanf("%d",num);

while((L=L-next)!=head)

{//如果找到就刪除節(jié)點

if(L-number==num)

{

L-prior-next=L-next;

L-next-prior=L-prior;

ifempty--;?//ifempty減1?

printf("編號為%d的貨物成功出庫",num);?

getchar();getchar();

return?head;?

}?

}

printf("沒有此編號的貨物,請查看是否還有貨物。\n\n");

getchar();getchar();

return?(head);

}

dlnode?*outname(dlnode?*L)//按名稱出庫函數(shù)

{

char?na[32];

dlnode?*head=L;

printf("請輸入出庫貨物的名稱:");

scanf("%s",na);

while((L=L-next)!=head)

{//如果找到就刪除節(jié)點

if(strcmp(L-name,na)==0)

{

L-prior-next=L-next;

L-next-prior=L-prior;

ifempty--;?//ifempty減1?

printf("名稱為%s的貨物成功出庫",na);

getchar();getchar();

return?(head);

}

}

printf("沒有此名稱的貨物,請查看是否還有貨物。\n\n");

getchar();getchar();

return(head);

}?

void?display(dlnode?*L)//顯示貨物清單

{

dlnode?*head=L;

if(ifempty==0)

{

printf("沒有貨物可顯示\n");

getchar();getchar();

return;

}

L=L-next;

do

{?

printf("\n編號:%d\n",L-number);

printf("名稱:%s\n",L-name)?;

printf("數(shù)量:%d\n\n",L-counter);

}while((L=L-next)!=head);

getchar();getchar();?

}

void?print(dlnode?*L)

{

dlnode?*head=L;

L=L-next;

char?filename[max];

FILE?*out;

if(ifempty==0)

{

printf("沒有貨物可輸出\n");

getchar();getchar();

return;

}

printf("請輸入文件名稱:");

scanf("%s",filename);

if((out=fopen(filename,"w"))==NULL)

{

printf("打開文件失敗!\n");

getchar();getchar();

return;

}

do{?

fprintf(out,"編號:%d\n名稱:%s\n數(shù)量:%d\n\n",L-number,L-name,L-counter);

}while((L=L-next)!=head);

printf("輸出成功\n");getchar();getchar();

fclose(out);

}

C語言:如何自己做庫函數(shù)?

簡單的一個例子,但是基本的程序編譯的思想都在里面了,具體的需要你自己體會和查資料

跟著下面的步驟走

------------------------

第一步:我的電腦-屬性-高級-環(huán)境變量

添加3個變量

1.名字:path 值:vc的安裝目錄里面包含cl.exe的bin目錄路徑+";"+vc目錄下包含mspdb80.dll的目錄的路徑

比如我的是D:\Program Files\Microsoft Visual Studio 8\VC\bin;D:\Program Files\Microsoft Visual Studio 8\Common7\IDE;

2.名字:include 值:vc安裝目錄下的include目錄,主要是為了找到頭文件,我的是D:\Program Files\Microsoft Visual Studio 8\VC\include;D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include;

3.名字:lib 值:vc目錄下包含庫文件的目錄路徑

我的是D:\Program Files\Microsoft Visual Studio 8\VC\lib;D:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib;

第二步:需要下面兩個文件

//-------------libdemo.c

#include stdio.h

void lib_func()

{

printf("this routine in lib\n");

}

//------------main.c

void lib_func();

int main(int argc, char *argv[])

{

lib_func();

}

第三步:命令

cl /c libdemo.c '編譯libdemo.c 生成libdemo.obj

lib libdemo.obj '生成libdemo.lib 庫文件

cl /c main.c '編譯main.c

link main.obj libdemo.lib '生成main.exe

---------------------------------------------------

呵呵 加點東西,參看4樓的建議,在做個dll,COM組件就不做了,有點復雜了

1。把libdemo.c 稍微改下

//-------------libdemo.c

#include stdio.h

__declspec (dllexport) void lib_func()

{

printf("this routine in lib\n");

}

2。命令

cl /c libdemo.c main.c

link libdemo.obj /dll '生成libdemo.lib

link main.obj libdemo.lib

關(guān)于c語言中如何創(chuàng)建自己的庫函數(shù)能不能再詳細的解釋一下,謝謝了!??!

哈哈,選我吧!庫分靜態(tài)庫和動態(tài)鏈接庫,靜態(tài)庫以lib結(jié)尾,被編譯器里的鏈接器識別。windows下動態(tài)庫以dll結(jié)尾,被操作系統(tǒng)加載以模塊方式映射到進程地址空間。一般初學者先學會創(chuàng)建的是靜態(tài)庫。靜態(tài)庫是一個無需重定位的函數(shù)集。怎么做到無需重定位呢?這是編譯器做的編譯工作,例如它指定開頭的位置作為基址,剩下的代碼用到的都是相對偏移。這樣,這段二進制代碼可以被放在內(nèi)存中的任何位置執(zhí)行,被寫入了lib文件里。在lib文件里,包含了函數(shù)名與函數(shù)地址組成的結(jié)構(gòu)體,通過它編譯器可以找到lib文件里需要的二進制代碼并以靜態(tài)聯(lián)編的方式寫入我們調(diào)用它的exe文件里。這種代碼是被塞進exe文件里而無需修改,并在程序執(zhí)行時被用到。為了讓庫被別人調(diào)用,我們可以寫一個頭文件.h,包含函數(shù)原型及聲明。

分享文章:c語言怎么寫出庫函數(shù),c庫函數(shù)實現(xiàn)
本文網(wǎng)址:http://www.muchs.cn/article22/phjjcc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、手機網(wǎng)站建設(shè)網(wǎng)站營銷、企業(yè)網(wǎng)站制作、商城網(wǎng)站、自適應網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管