欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

怎么組織構(gòu)建多文件C語言程序

這篇文章主要講解了“怎么組織構(gòu)建多文件C語言程序”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么組織構(gòu)建多文件C語言程序”吧!

在靈丘等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),全網(wǎng)整合營銷推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,靈丘網(wǎng)站建設(shè)費(fèi)用合理。

包含項(xiàng)目頭文件

位于第二部分中的 /* 01 項(xiàng)目包含文件 */ 的源代碼如下:

/* main.c - 喵嗚喵嗚流式編解碼器 */.../* 01 項(xiàng)目包含文件 */#include "main.h"#include "mmecode.h"#include "mmdecode.h"

#include 是 C 語言的預(yù)處理命令,它會(huì)將該文件名的文件內(nèi)容拷貝到當(dāng)前文件中。如果程序員在頭文件名稱周圍使用雙引號(hào)(""),編譯器將會(huì)在當(dāng)前目錄尋找該文件。如果文件被尖括號(hào)包圍(<>),編譯器將在一組預(yù)定義的目錄中查找該文件。

main.h 文件中包含了 main.c 文件中用到的定義和類型定義。我喜歡盡可能多將聲明放在頭文件里,以便我在我的程序的其他位置使用這些定義。

頭文件 mmencode.h 和 mmdecode.h 幾乎相同,因此我以 mmencode.h 為例來分析。

/* mmencode.h - 喵嗚喵嗚流編解碼器 */  #ifndef _MMENCODE_H#define _MMENCODE_H  #include <stdio.h>  int mm_encode(FILE *src, FILE *dst);  #endif /* _MMENCODE_H */

#ifdef#define#endif 指令統(tǒng)稱為 “防護(hù)” 指令。其可以防止 C 編譯器在一個(gè)文件中多次包含同一文件。如果編譯器在一個(gè)文件中發(fā)現(xiàn)多個(gè)定義/原型/聲明,它將會(huì)產(chǎn)生警告。因此這些防護(hù)措施是必要的。

在這些防護(hù)內(nèi)部,只有兩個(gè)東西:#include 指令和函數(shù)原型聲明。我在這里包含了 stdio.h 頭文件,以便于能在函數(shù)原型中使用 FILE 定義。函數(shù)原型也可以被包含在其他 C 文件中,以便于在文件的命名空間中創(chuàng)建它。你可以將每個(gè)文件視為一個(gè)獨(dú)立的命名空間,其中的變量和函數(shù)不能被另一個(gè)文件中的函數(shù)或者變量使用。

編寫頭文件很復(fù)雜,并且在大型項(xiàng)目中很難管理它。不要忘記使用防護(hù)。

喵嗚喵嗚編碼的最終實(shí)現(xiàn)

該程序的功能是按照字節(jié)進(jìn)行 MeowMeow 字符串的編解碼,事實(shí)上這是該項(xiàng)目中最簡單的部分。截止目前我所做的工作便是支持允許在適當(dāng)?shù)奈恢谜{(diào)用此函數(shù):解析命令行,確定要使用的操作,并打開將要操作的文件。下面的循環(huán)是編碼的過程:

/* mmencode.c - 喵嗚喵嗚流式編解碼器 */...   while (!feof(src)) {      if (!fgets(buf, sizeof(buf), src))       break;      for(i=0; i<strlen(buf); i++) {       lo = (buf[i] & 0x000f);       hi = (buf[i] & 0x00f0) >> 4;       fputs(tbl[hi], dst);       fputs(tbl[lo], dst);     }   }

簡單的說,當(dāng)文件中還有數(shù)據(jù)塊時(shí)( feof(3) ),該循環(huán)讀取(feof(3) )文件中的一個(gè)數(shù)據(jù)塊。然后將讀入的內(nèi)容的每個(gè)字節(jié)分成兩個(gè) hilo半字節(jié)nibble。半字節(jié)是半個(gè)字節(jié),即 4 個(gè)位。這里的奧妙之處在于可以用 4 個(gè)位來編碼 16 個(gè)值。我將 hilo 用作 16 個(gè)字符串查找表 tbl 的索引,表中包含了用半字節(jié)編碼的 MeowMeow 字符串。這些字符串使用 fputs(3) 函數(shù)寫入目標(biāo) FILE 流,然后我們繼續(xù)處理緩存區(qū)的下一個(gè)字節(jié)。

該表使用 table.h 中的宏定義進(jìn)行初始化,在沒有特殊原因(比如:要展示包含了另一個(gè)項(xiàng)目的本地頭文件)時(shí),我喜歡使用宏來進(jìn)行初始化。我將在未來的文章中進(jìn)一步探討原因。

喵嗚喵嗚解碼的實(shí)現(xiàn)

我承認(rèn)在開始工作前花了一些時(shí)間。解碼的循環(huán)與編碼類似:讀取 MeowMeow 字符串到緩沖區(qū),將編碼從字符串轉(zhuǎn)換為字節(jié)

 /* mmdecode.c - 喵嗚喵嗚流式編解碼器 */ ... int mm_decode(FILE *src, FILE *dst) {   if (!src || !dst) {     errno = EINVAL;     return -1;   }   return stupid_decode(src, dst); }

這不符合你的期望嗎?

在這里,我通過外部公開的 mm_decode() 函數(shù)公開了 stupid_decode() 函數(shù)細(xì)節(jié)。我上面所說的“外部”是指在這個(gè)文件之外。因?yàn)?stupid_decode() 函數(shù)不在該頭文件中,因此無法在其他文件中調(diào)用它。

當(dāng)我們想發(fā)布一個(gè)可靠的公共接口時(shí),有時(shí)候會(huì)這樣做,但是我們還沒有完全使用函數(shù)解決問題。在本例中,我編寫了一個(gè) I/O  密集型函數(shù),該函數(shù)每次從源中讀取 8 個(gè)字節(jié),然后解碼獲得 1 個(gè)字節(jié)寫入目標(biāo)流中。較好的實(shí)現(xiàn)是一次處理多于 8  個(gè)字節(jié)的緩沖區(qū)。更好的實(shí)現(xiàn)還可以通過緩沖區(qū)輸出字節(jié),進(jìn)而減少目標(biāo)流中單字節(jié)的寫入次數(shù)。

/* mmdecode.c - 喵嗚喵嗚流式編解碼器 */...int stupid_decode(FILE *src, FILE *dst){  char           buf[9];  decoded_byte_t byte;  int            i;      while (!feof(src)) {    if (!fgets(buf, sizeof(buf), src))      break;    byte.field.f0 = isupper(buf[0]);    byte.field.f1 = isupper(buf[1]);    byte.field.f2 = isupper(buf[2]);    byte.field.f3 = isupper(buf[3]);    byte.field.f4 = isupper(buf[4]);    byte.field.f5 = isupper(buf[5]);    byte.field.f6 = isupper(buf[6]);    byte.field.f7 = isupper(buf[7]);          fputc(byte.value, dst);  }  return 0;}

我并沒有使用編碼器中使用的位移方法,而是創(chuàng)建了一個(gè)名為 decoded_byte_t 的自定義數(shù)據(jù)結(jié)構(gòu)。

/* mmdecode.c - 喵嗚喵嗚流式編解碼器 */... typedef struct {  unsigned char f7:1;  unsigned char f6:1;  unsigned char f5:1;  unsigned char f4:1;  unsigned char f3:1;  unsigned char f2:1;  unsigned char f1:1;  unsigned char f0:1;} fields_t;  typedef union {  fields_t      field;  unsigned char value;} decoded_byte_t;

初次看到代碼時(shí)可能會(huì)感到有點(diǎn)兒復(fù)雜,但不要放棄。decoded_byte_t 被定義為 fields_tunsigned char聯(lián)合。可以將聯(lián)合中的命名成員看作同一內(nèi)存區(qū)域的別名。在這種情況下,valuefield 指向相同的 8 位內(nèi)存區(qū)域。將 field.f0 設(shè)置為 1 也將會(huì)設(shè)置 value 中的最低有效位。

雖然 unsigned char 并不神秘,但是對(duì) fields_t 的類型定義(typedef)也許看起來有些陌生。現(xiàn)代 C 編譯器允許程序員在結(jié)構(gòu)體中指定單個(gè)位字段的值。字段所在的類型是一個(gè)無符號(hào)整數(shù)類型,并在成員標(biāo)識(shí)符后緊跟一個(gè)冒號(hào)和一個(gè)整數(shù),該整數(shù)指定了位字段的長度。

這種數(shù)據(jù)結(jié)構(gòu)使得按字段名稱訪問字節(jié)中的每個(gè)位變得簡單,并可以通過聯(lián)合中的 value 字段訪問組合后的值。我們依賴編譯器生成正確的移位指令來訪問字段,這可以在調(diào)試時(shí)為你節(jié)省不少時(shí)間。

最后,因?yàn)?stupid_decode() 函數(shù)一次僅從源 FILE 流中讀取 8 個(gè)字節(jié),所以它效率并不高。通常我們嘗試最小化讀寫次數(shù),以提高性能和降低調(diào)用系統(tǒng)調(diào)用的開銷。請(qǐng)記住:少量的讀取/寫入大的塊比大量的讀取/寫入小的塊好得多。

感謝各位的閱讀,以上就是“怎么組織構(gòu)建多文件C語言程序”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)怎么組織構(gòu)建多文件C語言程序這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

新聞名稱:怎么組織構(gòu)建多文件C語言程序
文章地址:http://www.chinadenli.net/article34/gicspe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版品牌網(wǎng)站建設(shè)網(wǎng)站排名網(wǎng)站導(dǎo)航手機(jī)網(wǎng)站建設(shè)

廣告

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

商城網(wǎng)站建設(shè)