精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何組織構建多文件C語言程序(二)

開發 后端
在第一篇中,我設計了一個名為喵嗚喵嗚的多文件 C 程序,該程序實現了一個玩具編解碼器。我將在本系列的第二篇中深入研究由多個文件組成的 C 程序的結構。

[[319060]]

我將在本系列的第二篇中深入研究由多個文件組成的 C 程序的結構。

第一篇中,我設計了一個名為喵嗚喵嗚的多文件 C 程序,該程序實現了一個玩具編解碼器。我也提到了程序設計中的 Unix 哲學,即在一開始創建多個空文件,并建立一個好的結構。最后,我創建了一個 Makefile 文件夾并闡述了它的作用。在本文中將另一個方向展開:現在我將介紹簡單但具有指導性的喵嗚喵嗚編解碼器的實現。

當讀過我的《如何寫一個好的 C 語言 main 函數》后,你會覺得喵嗚喵嗚編解碼器的 main.c 文件的結構很熟悉,其主體結構如下:

  1. /* main.c - 喵嗚喵嗚流式編解碼器 */
  2.  
  3. /* 00 系統包含文件 */
  4. /* 01 項目包含文件 */
  5. /* 02 外部聲明 */
  6. /* 03 定義 */
  7. /* 04 類型定義 */
  8. /* 05 全局變量聲明(不要用)*/
  9. /* 06 附加的函數原型 */
  10.    
  11. int main(int argc, char *argv[])
  12. {
  13.   /* 07 變量聲明 */
  14.   /* 08 檢查 argv[0] 以查看該程序是被如何調用的 */
  15.   /* 09 處理來自用戶的命令行選項 */
  16.   /* 10 做點有用的事情 */
  17. }
  18.    
  19. /* 11 其它輔助函數 */

包含項目頭文件

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

  1. /* main.c - 喵嗚喵嗚流式編解碼器 */
  2. ...
  3. /* 01 項目包含文件 */
  4. #include "main.h"
  5. #include "mmecode.h"
  6. #include "mmdecode.h"

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

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

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

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

#ifdef#define#endif 指令統稱為 “防護” 指令。其可以防止 C 編譯器在一個文件中多次包含同一文件。如果編譯器在一個文件中發現多個定義/原型/聲明,它將會產生警告。因此這些防護措施是必要的。

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

編寫頭文件很復雜,并且在大型項目中很難管理它。不要忘記使用防護。

喵嗚喵嗚編碼的最終實現

該程序的功能是按照字節進行 MeowMeow 字符串的編解碼,事實上這是該項目中最簡單的部分。截止目前我所做的工作便是支持允許在適當的位置調用此函數:解析命令行,確定要使用的操作,并打開將要操作的文件。下面的循環是編碼的過程:

  1. /* mmencode.c - 喵嗚喵嗚流式編解碼器 */
  2. ...
  3. while (!feof(src)) {
  4.  
  5. if (!fgets(buf, sizeof(buf), src))
  6. break;
  7.  
  8. for(i=0; i<strlen(buf); i++) {
  9. lo = (buf[i] & 0x000f);
  10. hi = (buf[i] & 0x00f0) >> 4;
  11. fputs(tbl[hi], dst);
  12. fputs(tbl[lo], dst);
  13. }
  14. }

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

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

喵嗚喵嗚解碼的實現

我承認在開始工作前花了一些時間。解碼的循環與編碼類似:讀取 MeowMeow 字符串到緩沖區,將編碼從字符串轉換為字節

  1.  /* mmdecode.c - 喵嗚喵嗚流式編解碼器 */
  2.  ...
  3.  int mm_decode(FILE *src, FILE *dst)
  4.  {
  5.    if (!src || !dst) {
  6.      errno = EINVAL;
  7.      return -1;
  8.    }
  9.    return stupid_decode(src, dst);
  10.  }

這不符合你的期望嗎?

在這里,我通過外部公開的 mm_decode() 函數公開了 stupid_decode() 函數細節。我上面所說的“外部”是指在這個文件之外。因為 stupid_decode() 函數不在該頭文件中,因此無法在其他文件中調用它。

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

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

我并沒有使用編碼器中使用的位移方法,而是創建了一個名為 decoded_byte_t 的自定義數據結構。

  1. /* mmdecode.c - 喵嗚喵嗚流式編解碼器 */
  2. ...
  3.  
  4. typedef struct {
  5.  unsigned char f7:1;
  6.  unsigned char f6:1;
  7.  unsigned char f5:1;
  8.  unsigned char f4:1;
  9.  unsigned char f3:1;
  10.  unsigned char f2:1;
  11.  unsigned char f1:1;
  12.  unsigned char f0:1;
  13. } fields_t;
  14.  
  15. typedef union {
  16.  fields_t      field;
  17.  unsigned char value;
  18. } decoded_byte_t;

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

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

這種數據結構使得按字段名稱訪問字節中的每個位變得簡單,并可以通過聯合中的 value 字段訪問組合后的值。我們依賴編譯器生成正確的移位指令來訪問字段,這可以在調試時為你節省不少時間。

最后,因為 stupid_decode() 函數一次僅從源 FILE 流中讀取 8 個字節,所以它效率并不高。通常我們嘗試最小化讀寫次數,以提高性能和降低調用系統調用的開銷。請記住:少量的讀取/寫入大的塊比大量的讀取/寫入小的塊好得多。

總結

用 C 語言編寫一個多文件程序需要程序員要比只是是一個 main.c 做更多的規劃。但是當你添加功能或者重構時,只需要多花費一點兒努力便可以節省大量時間以及避免讓你頭痛的問題。

回顧一下,我更喜歡這樣做:多個文件,每個文件僅有簡單功能;通過頭文件公開那些文件中的小部分功能;把數字常量和字符串常量保存在頭文件中;使用 Makefile 而不是 Bash 腳本來自動化處理事務;使用 main() 函數來處理命令行參數解析并作為程序主要功能的框架。 

 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2020-03-17 17:49:58

C語言編程語言

2020-12-15 11:23:09

數據驅動企業數字化

2023-08-17 20:13:42

2011-07-05 17:07:14

C語言

2018-02-24 12:17:56

C程序內存方式

2015-08-17 17:57:43

IT性能運維

2019-07-29 08:00:18

文件容器Docker Comp

2011-07-22 15:10:51

Objective-C 文件

2009-08-13 17:04:09

C#語言C#程序

2023-12-08 14:32:02

C語言編程文件操作

2025-03-21 08:00:00

大型語言模型視覺語言微調

2023-09-27 23:38:29

C程序

2009-06-15 11:03:10

Java語言C#語言

2025-04-18 08:37:09

2012-08-13 09:31:33

程序

2010-01-22 11:23:06

C++程序

2017-03-02 11:10:39

AndroidMVVM應用程序

2017-12-10 14:13:14

云服務云原生應用程序

2016-08-10 10:18:55

2011-05-17 14:53:35

C
點贊
收藏

51CTO技術棧公眾號

国产精品久久久久国产a级| 石原莉奈一区二区三区在线观看| 亚洲一区二区视频在线| 美女视频第一区二区三区免费观看网站| 欧美日韩中文字幕日韩欧美| 欧美日韩精品免费看| 免费在线不卡av| 一区二区日韩欧美| 日韩欧美高清dvd碟片| 成人毛片视频网站| 国产三级在线播放| 99国产精品国产精品毛片| 国产精品高精视频免费| 免费一级片在线观看| 国产精品欧美大片| 在线观看不卡一区| 国产精品国三级国产av| 国产视频第一页在线观看| 国产激情一区二区三区| 国产suv精品一区二区三区88区| 亚洲区一区二区三| 婷婷国产精品| 日韩精品一区二区三区在线 | 国产精选久久久| 国产欧美在线| 欧美成人免费播放| 国产免费嫩草影院| 亚洲bt欧美bt精品777| 3d成人h动漫网站入口| 免费在线激情视频| 女人天堂av在线播放| 国产精品免费久久| 欧美日韩另类丝袜其他| 亚洲精品一区二区三区四区| 免费在线一区观看| 国产91网红主播在线观看| 久久久一区二区三区四区| 欧美精品一区二区三区精品| 亚洲成人1234| 少妇高潮一69aⅹ| 欧美黄色a视频| 色综合久久久网| 男女啪啪免费视频网站| 第一福利在线| www成人在线观看| 成人18视频| 精品国产无码AV| 久久精品国产亚洲一区二区三区| 性欧美xxxx交| 99热国产在线观看| 国产字幕视频一区二区| 欧美成人免费在线视频| 69av视频在线| 最新国产精品| 欧美精品在线观看91| 看黄色录像一级片| 欧美+日本+国产+在线a∨观看| 俺去亚洲欧洲欧美日韩| 永久免费观看片现看| 日本道不卡免费一区| 国产一区二区动漫| 免费看的黄色录像| 天天操综合网| 美日韩在线视频| 久久久精品视频免费观看| 欧美1区免费| 久久久久久有精品国产| 日本一区二区免费在线观看| 日韩一级网站| 秋霞av国产精品一区| 日韩精品一区二区亚洲av| 久久成人在线| 国产欧美精品在线| 精品区在线观看| 成人精品电影在线观看| 久久福利电影| av基地在线| 亚洲欧美在线高清| 日韩精品一区二区在线视频 | 精品99在线| 中文字幕日韩精品有码视频| 精品无码一区二区三区蜜臀| 欧美激情综合| 欧美一级在线亚洲天堂| 成年人晚上看的视频| 激情深爱一区二区| 国产欧美一区二区三区另类精品 | 大桥未久一区二区三区| 怡红院av在线| 午夜天堂影视香蕉久久| 色婷婷综合久久久久中文字幕 | 51精品国产人成在线观看| 性生交生活影碟片| 久久精品这里都是精品| 亚洲啪啪av| 手机av免费在线| 91精品91久久久中77777| 网站在线你懂的| 欧美黄色录像| 久久精品国产一区二区电影| 久久久久性色av无码一区二区| 香蕉国产精品偷在线观看不卡| 国产免费久久av| 黄色一级大片在线免费看国产| 久久久青草青青国产亚洲免观| 亚洲精品日韩成人| 国产在线看片免费视频在线观看| 色噜噜狠狠一区二区三区果冻| 手机精品视频在线| 国产精品免费99久久久| 欧美精品中文字幕一区| 日韩 国产 欧美| 国产不卡视频一区| 午夜一区二区三区| 美女网站在线看| 操你啦视频在线| 亚洲久本草在线中文字幕| 成人在线免费观看av| av日韩在线免费观看| 亚洲欧美日韩国产精品| 校园春色 亚洲| 日本欧美久久久久免费播放网| 国产高清精品一区二区| av小片在线| 欧美性xxxxx极品娇小| 宇都宫紫苑在线播放| 国产99久久| 91精品国产一区| 亚洲爆乳无码一区二区三区| 国产精品久线在线观看| 成人小视频在线看| 另类图片第一页| 欧美激情精品久久久| 一级做a爱片性色毛片| 久久女同互慰一区二区三区| 国产 日韩 欧美在线| 国产一区二区视频在线看 | www.亚洲.com| 色综合久久88色综合天天6| 国产污在线观看| 国内自拍视频一区二区三区| 成人国产在线视频| 日本三级在线视频| 欧美色欧美亚洲另类二区| 国产精品中出一区二区三区| 99九九精品视频| 久久久精品国产**网站| 久久久久免费视频| 国产夫妻性生活视频| 亚洲欧洲综合另类| 97人人模人人爽人人澡| 亚洲情侣在线| 亚洲自拍偷拍福利| 亚洲小说区图片区都市| 欧美一二三区在线| 毛片aaaaa| 国产91精品精华液一区二区三区| 加勒比海盗1在线观看免费国语版| 欧美黑粗硬大| 欧美精品免费在线| 亚洲精品久久久久久无码色欲四季| 亚洲欧美成aⅴ人在线观看| 亚洲精品在线网址| 极品中文字幕一区| 精品一区二区久久久久久久网站| 成人bbav| 亚洲欧美另类在线观看| 国产真人无遮挡作爱免费视频| 国产情人综合久久777777| 日韩一级理论片| 99久久99视频只有精品| 91在线色戒在线| 国产第一页在线| 国产偷亚洲偷欧美偷精品| 精品人妻一区二区色欲产成人| 亚洲区欧洲区| 亚洲国产精品久久久久婷婷884| 337p日本欧洲亚洲大胆张筱雨| 国产综合网站| 久久免费看av| 国产精品99| 欧美激情一区二区久久久| 日本免费不卡视频| 欧美最新大片在线看| 91n在线视频| 成人av网站在线观看| 成人亚洲视频在线观看| 美女毛片一区二区三区四区最新中文字幕亚洲 | 一本到不卡免费一区二区| 日本视频在线免费| 成人小视频免费观看| 无码日韩人妻精品久久蜜桃| 亚洲字幕久久| 美国av一区二区三区| 美女视频一区| 91精品91久久久久久| 成人精品一区二区| 欧美成人一级视频| 中文字幕 视频一区| 一区二区三区中文在线观看| 欧美亚一区二区三区| 精品一区二区三区视频| 成人毛片一区二区| 午夜av一区| 蜜桃麻豆www久久国产精品| 日韩三级一区| 日本韩国在线不卡| 欧美6一10sex性hd| 中文字幕不卡av| 亚洲三区在线观看无套内射| 欧美一区2区视频在线观看| 色屁屁影院www国产高清麻豆| 亚洲人精品一区| 少妇久久久久久久久久| 岛国av在线一区| 最新天堂在线视频| 久久视频一区| 自拍日韩亚洲一区在线| 欧美一区在线看| 亚洲精品一区二区三区蜜桃久| 久久久亚洲欧洲日产| 91精品网站| 日韩久久一区| 国产精品久久久91| 亚洲高清在线播放| 主播大秀视频在线观看一区二区| 欧美国产在线视频| caopo在线| 日韩中文字幕免费看| 黄色毛片在线看| 日韩成人在线观看| 日本韩国免费观看| 337p日本欧洲亚洲大胆精品| 国产精品国产三级国产普通话对白| 在线免费观看视频一区| 国产农村妇女aaaaa视频| 亚洲国产日韩a在线播放| 中文字幕另类日韩欧美亚洲嫩草| 国产欧美日韩另类一区| 91久久免费视频| 久久综合九色综合久久久精品综合| 第一页在线视频| 国产精品一区久久久久| 午夜av中文字幕| 精品一区二区三区免费| 欧美成人三级在线播放| 奇米在线7777在线精品| 无码内射中文字幕岛国片| 久久久久国产精品一区三寸| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 欧美插天视频在线播放| 米奇精品一区二区三区| 色av吧综合网| 欧美成人三区| www.久久撸.com| 成人片在线看| 九九九久久国产免费| 欧美精品videosex| 午夜伦理精品一区| 中文在线а√在线8| 日本国产欧美一区二区三区| 自拍偷自拍亚洲精品被多人伦好爽 | 免播放器亚洲| 日本成人中文字幕在线| 麻豆精品新av中文字幕| 亚洲精品第三页| 国产寡妇亲子伦一区二区| 麻豆短视频在线观看| av电影天堂一区二区在线| 国产吞精囗交久久久| 国产日韩精品一区二区浪潮av| 国产午夜精品福利视频| 日韩毛片高清在线播放| 九九热这里有精品视频| 亚洲国产成人精品视频| 天天综合天天干| 欧美日韩一区二区三区高清| 国产三级自拍视频| 欧美精品一区二区久久婷婷| 青草久久伊人| 中文字幕日韩高清在线| 国产精品一区二区女厕厕| 成人综合日日夜夜| 极品校花啪啪激情久久| 欧美日韩国产高清电影| 九一免费在线观看| 一本久道久久久| 日本超碰在线观看| 成人免费看视频| 摸摸摸bbb毛毛毛片| 亚洲精品国产第一综合99久久 | 成人免费看片视频| 精品三级av| 亚洲欧美国产精品桃花| 欧美视频二区| 香蕉视频禁止18| 成人免费视频网站在线观看| 免费观看av网站| 亚洲女人的天堂| 日韩免费av网站| 精品粉嫩aⅴ一区二区三区四区| 黄色片在线播放| 欧美人与性动交| 日本免费久久| 99精彩视频| 日韩国产综合| 怡红院av亚洲一区二区三区h| 精品一区二区免费视频| 极品粉嫩小仙女高潮喷水久久| 成人欧美一区二区三区| 国产一级淫片a视频免费观看| 欧美一区二区在线不卡| eeuss影院在线播放| 久久人人爽人人爽人人片av高清| 国精品产品一区| 久久国产欧美精品| 韩日欧美一区| 亚洲精品mv在线观看| 国产午夜亚洲精品理论片色戒| 免费在线观看亚洲| 欧美精品九九99久久| 九色在线观看视频| 91精品国产自产91精品| **爰片久久毛片| 热这里只有精品| 日本欧美久久久久免费播放网| 亚洲黄色在线网站| 香蕉加勒比综合久久| a在线观看视频| 久热99视频在线观看| 国产精品美女午夜爽爽| 色综合久久久久久久久五月| 亚洲欧美日韩国产综合精品二区| 久久久久国产免费| 尤物视频一区二区| 国产乱码精品一区二区三区精东| 亚洲日本欧美中文幕| 中老年在线免费视频| 激情小说网站亚洲综合网| 亚洲国产91| 扒开伸进免费视频| 亚洲永久免费视频| 亚洲精品无码久久久| 欧美日韩国产成人高清视频| 欧美黄色一级| 日韩免费在线观看av| 黄视频网站在线观看| 精品五月天久久| xx欧美xxx| 欧美在线3区| 日本免费新一区视频| 丰满的亚洲女人毛茸茸| 在线一区二区视频| 在线观看国产原创自拍视频| 国产精品 欧美在线| 欧美日韩在线二区| 黄色在线视频网| 亚洲欧美综合网| www.综合色| 韩日欧美一区二区| 欧洲亚洲视频| 日本成人中文字幕在线| 国产精品污污网站在线观看| 亚洲最大成人在线视频| 久久亚洲精品一区二区| 涩爱av色老久久精品偷偷鲁| 日本免费a视频| www激情久久| 国产精品成人无码| 久久中文精品视频| 欧美91在线| 妺妺窝人体色www在线观看| 国产欧美日本一区二区三区| 亚洲中文字幕在线观看| 欧美日本高清一区| 亚洲精品进入| 亚洲娇小娇小娇小| 亚洲综合av网| 狠狠狠综合7777久夜色撩人| 91精品国产综合久久男男| 黄色日韩在线| 亚洲第一成人网站| 3d成人h动漫网站入口| 免费毛片在线看片免费丝瓜视频| 麻豆成人小视频| 激情综合色综合久久| 日本一区二区欧美| 中文字幕在线观看日韩| 99re8这里有精品热视频8在线 | 日本成人看片网址| 国产麻豆成人精品| 亚洲熟妇无码乱子av电影| 最近日韩中文字幕中文| 亚洲视频一起| 北条麻妃视频在线| 亚洲国产精品久久不卡毛片| 国产精品久久久久久久龚玥菲| 91麻豆精品秘密入口| 肉色丝袜一区二区| 亚洲国产精一区二区三区性色|