中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

用c語(yǔ)言封裝函數(shù)成庫(kù) c語(yǔ)言編好程序后怎么封裝

C語(yǔ)言中如何將自己常用的函數(shù)封裝到編譯器的庫(kù)函數(shù)中具體應(yīng)該怎么做呢?

用編譯器提供的庫(kù)管理工具。

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的安溪網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

C語(yǔ)言的編譯器都會(huì)提供一個(gè)命令行工具,可以把自己編譯后的.obj模塊加入指定的庫(kù)文件,以后使用時(shí)只需要連接該庫(kù)文件即可。這個(gè)命令行工具通常是lib.exe,用這個(gè)工具可以查看庫(kù)中的模塊,可以把模塊加入到庫(kù)中,可以從庫(kù)中刪除模塊。這個(gè)工具不僅僅是自己建立的庫(kù)文件的管理工具,可以管理所有的庫(kù)文件,包括C語(yǔ)言提供的標(biāo)準(zhǔn)庫(kù)。

C語(yǔ)言怎么封裝自己寫(xiě)的函數(shù)

用C語(yǔ)言的時(shí)候,您是否還在使用printf函數(shù)來(lái)輸出日志呢?您是否考慮過(guò)將printf函數(shù)打印的內(nèi)容存到文件中去呢?您是否想擁有一個(gè)可選擇的既支持輸出到屏幕又支持存儲(chǔ)到文件中的日志函數(shù)呢?很高興的告訴您,如果您愿意的話(huà),歡迎使用本人編寫(xiě)的一個(gè)一套日志函數(shù),該套函數(shù)由五部分組成,分別是宏變量BUF_SIZE、結(jié)構(gòu)體log_st、log_init函數(shù)、log_debug函數(shù)和log_checksize函數(shù)。其中宏變量BUF_SIZE用來(lái)限制每次輸出的日志的最大長(zhǎng)度;結(jié)構(gòu)體用來(lái)存儲(chǔ)用戶(hù)需求,包括文件路徑、文件描述符號(hào)、單個(gè)文件最大大小、輸出方式標(biāo)志、文件命名標(biāo)志等;log_init函數(shù)用來(lái)完成用戶(hù)需求錄入、文件創(chuàng)建等功能,在mian函數(shù)的開(kāi)始調(diào)用一次即可;log_debug函數(shù)的功能跟printf很類(lèi)似,是在printf基礎(chǔ)上進(jìn)行的擴(kuò)充,實(shí)現(xiàn)將日志輸出到屏幕或者寫(xiě)入到文件,在需要打印日志的地方調(diào)用該函數(shù);log_checksize函數(shù)用來(lái)檢測(cè)日志文件大小是否超過(guò)最大大小限制,它需要您定時(shí)或者定點(diǎn)調(diào)用它,如果一直不調(diào)用,則日志文件將不受指定的最大大小限制。

一、定義宏變量BUF_SIZE

view plaincopy to clipboardprint?

#define?BUF_SIZE?1024

二、定義log_st結(jié)構(gòu)體

view plaincopy to clipboardprint?

typedef?struct?_log_st?log_st;

struct?_log_st

{

char?path[128];

int?fd;

int?size;

int?level;

int?num;

};

三、定義log_init函數(shù)

參數(shù)說(shuō)明:path——您要存儲(chǔ)的文件路徑;size——單個(gè)文件的最大大小,如果超過(guò)該大小則新建新的文件用來(lái)存儲(chǔ);level——日志輸出方式,建議在上層限制其值的范圍為0到3,0表示日志既不輸出到屏幕也不創(chuàng)建文件和保存到文件,1表示日志保存到文件但不輸出到屏幕,2表示日志既輸出到屏幕也保存到文件,3表示日志只輸出到文件而不創(chuàng)建文件和存入文件;num——日志文件命名方式,非0表示以(int)time(NULL)作為文件名來(lái)保存文件,文件數(shù)量隨著日志量的遞增而遞增;0表示以“.new”和“.bak”為文件名來(lái)保存文件,文件數(shù)量不超過(guò)兩個(gè),隨著日志量的遞增,舊的日志文件將被新的覆蓋,更直觀(guān)的說(shuō)就是說(shuō).new”和“.bak”文件只保存最近的日志。

view plaincopy to clipboardprint?

log_st?*log_init(char?*path,?int?size,?int?level,?int?num)

{

char?new_path[128]?=?{0};

if?(NULL?==?path?||?0?==?level)?return?NULL;

log_st?*log?=?(log_st?*)malloc(sizeof(log_st));

memset(log,?0,?sizeof(log_st));

if?(level?!=?3)

{

//the?num?use?to?control?file?naming

log-num?=?num;

if(num)

snprintf(new_path,?128,?"%s%d",?path,?(int)time(NULL));

else

snprintf(new_path,?128,?"%s.new",?path);

if(-1?==?(log-fd?=?open(new_path,?O_RDWR|O_APPEND|O_CREAT|O_SYNC,?S_IRUSR|S_IWUSR|S_IROTH)))

{

free(log);

log?=?NULL;

return?NULL;

}

}

strncpy(log-path,?path,?128);

log-size?=?(size??0???size:0);

log-level?=?(level??0???level:0);

return?log;

}

四、定義log_debug函數(shù)

view plaincopy to clipboardprint?

void?log_debug(log_st?*log,?const?char?*msg,?...)

{

va_list?ap;

time_t?now;

char?*pos;

char?_n?=?'\n';

char?message[BUF_SIZE]?=?{0};

int?nMessageLen?=?0;

int?sz;

if(NULL?==?log?||?0?==?log-level)?return;

now?=?time(NULL);

pos?=?ctime(now);

sz?=?strlen(pos);

pos[sz-1]=']';

snprintf(message,?BUF_SIZE,?"[%s?",?pos);

for?(pos?=?message;?*pos;?pos++);

sz?=?pos?-?message;

va_start(ap,?msg);

nMessageLen?=?vsnprintf(pos,?BUF_SIZE?-?sz,?msg,?ap);

va_end(ap);

if?(nMessageLen?=?0)?return;

if?(3?==?log-level)

{

printf("%s\n",?message);

return;

}

if?(2?==?log-level)

printf("%s\n",?message);

write(log-fd,?message,?strlen(message));

write(log-fd,?_n,?1);

fsync(log-fd);

}

五、定義log_checksize函數(shù)

view plaincopy to clipboardprint?

void?log_checksize(log_st?*log)

{

struct?stat?stat_buf;

char?new_path[128]?=?{0};

char?bak_path[128]?=?{0};

if(NULL?==?log?||?3?==?log-level?||?'\0'?==?log-path[0])?return;

memset(stat_buf,?0,?sizeof(struct?stat));

fstat(log-fd,?stat_buf);

if(stat_buf.st_size??log-size)

{

close(log-fd);

if(log-num)

snprintf(new_path,?128,?"%s%d",?log-path,?(int)time(NULL));

else

{

snprintf(bak_path,?128,?"%s.bak",?log-path);

snprintf(new_path,?128,?"%s.new",?log-path);

remove(bak_path);?//delete?the?file?*.bak?first

rename(new_path,?bak_path);?//change?the?name?of?the?file?*.new?to?*.bak

}

//create?a?new?file

log-fd?=?open(new_path,?O_RDWR|O_APPEND|O_CREAT|O_SYNC,?S_IRUSR|S_IWUSR|S_IROTH);

}

}

C語(yǔ)言如何生成庫(kù)文件?

有一些代碼,我們編程時(shí)經(jīng)常用到,或者我們對(duì)某些部分很熟悉,并寫(xiě)出了一些可用的接口。這時(shí),我們會(huì)考慮把這些c文件做成一個(gè)lib庫(kù),以方便自己使用,或這給別人調(diào)用。

我這里介紹下在vc++6.0下如何來(lái)制作靜態(tài)庫(kù):

第一步:創(chuàng)建一個(gè)工程,選擇Win32Static Library,輸入工程名。這時(shí)就創(chuàng)建好了。

第二步:工程創(chuàng)建好了,再點(diǎn)擊新建,這時(shí)選擇文件,選擇c++ source file選項(xiàng),創(chuàng)建一個(gè).c

文件。

在這個(gè)文件中,你可以寫(xiě)入你要做成庫(kù)的c函數(shù)。當(dāng)然,可以繼續(xù)創(chuàng)建其他c文件,然后將要供外部使用的接口單獨(dú)放到頭文件中,一般而言,一個(gè)c文件對(duì)應(yīng)一個(gè)頭文件。

第三步:完成以上步驟后,我們就可以生成庫(kù)了。事實(shí)上,我們點(diǎn)擊編譯即可,這時(shí)就可以生成.lib文件了。

一般情況下,是可以正常生成lib文件的。有頭文件和lib文件就可以給別人用了。然后我們可以寫(xiě)一個(gè)測(cè)試函數(shù)來(lái)試試可不可以使用。

要調(diào)用生成的lib中的函數(shù),就要引入頭函數(shù)。這時(shí),你把lib和頭文件放入當(dāng)前工程中,但build的時(shí)候卻顯示了連接錯(cuò)誤。那是因?yàn)槟銢](méi)有把lib文件包含進(jìn)來(lái)。加入下面這句話(huà)即可了:

#pragma comment(lib, "mylib.lib ")

Ok,自己的lib庫(kù)就這樣做成了。以后可以隨便調(diào)用了。

在C語(yǔ)言中,如何將用戶(hù)自定義函數(shù)變成庫(kù)函數(shù)(.h)文件

除了樓上兩位說(shuō)的,還要把頭文件放在你的編譯環(huán)境中設(shè)置的include directory中,比如,一般會(huì)放在main的文件所在的目錄。

網(wǎng)頁(yè)名稱(chēng):用c語(yǔ)言封裝函數(shù)成庫(kù) c語(yǔ)言編好程序后怎么封裝
當(dāng)前路徑:http://www.rwnh.cn/article24/doshsje.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、微信小程序、網(wǎng)站維護(hù)、小程序開(kāi)發(fā)、網(wǎng)站制作、品牌網(wǎng)站建設(shè)

廣告

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

商城網(wǎng)站建設(shè)
迁西县| 霍邱县| 临夏市| 明光市| 新和县| 苏州市| 临安市| 鸡西市| 格尔木市| 吉安市| 永新县| 仪陇县| 天水市| 棋牌| 丰顺县| 嘉鱼县| 泗水县| 莆田市| 通渭县| 山东| 仁化县| 达日县| 宣化县| 松滋市| 宁海县| 永和县| SHOW| 鱼台县| 台南市| 安乡县| 海门市| 旬邑县| 香格里拉县| 水富县| 云梦县| 泰来县| 晋宁县| 河池市| 兴城市| 西贡区| 五峰|