最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

用C語(yǔ)言制作一個(gè)編譯器 一 DEBUG

2023-02-17 20:08 作者:Sperenza  | 我要投稿

工欲善其事,必先利其器。在我們開始制作編程之前,我們要先制作一個(gè)簡(jiǎn)易的 Debug 工具。


預(yù)設(shè)

首先我們要先建立多個(gè)文件,結(jié)構(gòu)如下


將 CMakeLists.txt 改為


將 scripts/CMakeLists.txt 設(shè)為


將 scripts/helpers/CMakeLists.txt 設(shè)為

我們一切 debug 有關(guān)的程序都將集中到 logger 中編寫


logger.h

以上是我的logger藍(lán)圖,設(shè)計(jì)上我參考了python中的logging模塊


報(bào)告等級(jí)

我在這設(shè)計(jì)了四個(gè)報(bào)告等級(jí),用于應(yīng)對(duì)各種不同的狀況

  • 通常級(jí):LOGGER_MESSAGE_LEVEL_INFO

  • 診斷級(jí):LOGGER_MESSAGE_LEVEL_DEBUG

  • 警告級(jí):LOGGER_MESSAGE_LEVEL_WARNING

  • 致命級(jí):LOGGER_MESSAGE_LEVEL_ERROR

為這四個(gè)報(bào)告等級(jí),我定義了一個(gè)類別

這行代表類別 LOGGER_MESSAGE_FN 是一個(gè)函數(shù)指針。

它不會(huì)返回任何東西,它需要struct logger指針,一個(gè)String數(shù)據(jù),以及各種其他變量

然后在 struct logger 里面添加四個(gè)函數(shù)通道

這樣就可以實(shí)現(xiàn)


通用函數(shù)

該函數(shù)會(huì)返回一個(gè)struct logger的指針。

引用該函數(shù)時(shí),系統(tǒng)會(huì)尋找是否已經(jīng)存在同名的 logger,如果有就返回該 logger,反之創(chuàng)建新的 logger。



刪除指定的 logger


void kill_all_logger();

刪除全部的 logger


將一個(gè)字符轉(zhuǎn)換成更加易讀的文字


logger.c

在創(chuàng)建各種函數(shù)之前,我們需要引用一些模塊以方便后續(xù)的編程


報(bào)告等級(jí)

首先我們需要制作一個(gè)簡(jiǎn)易的顯示報(bào)告等級(jí)的函數(shù),代碼我就不贅述了


再來我們需要制作一個(gè)簡(jiǎn)易的報(bào)告函數(shù)

該函數(shù)用于輸出數(shù)據(jù)到指定的流文件中,基本上什么文件都可以。


stderr 是系統(tǒng)預(yù)設(shè)用于輸出錯(cuò)誤的流文件。


va_list 是在C語(yǔ)言中解決變參問題的一組宏,在這情況我們能假設(shè)這里面已經(jīng)存儲(chǔ)了無(wú)限量的變量。


針對(duì)于 va_list 制作的輸出函數(shù),會(huì)結(jié)合 format 和 ap 中的數(shù)據(jù)生成格式化數(shù)據(jù)并將其輸出到指定的流文件中。


然后寫出四個(gè)通用函數(shù)


這四個(gè)函數(shù)都是同樣的事情:讀取潛在的無(wú)限變量,并引用 logger_message 函數(shù)


create_logger

考慮到不同的函數(shù)會(huì)引用同一個(gè)logger,所以我決定讓logger以全局變量的形式出現(xiàn)在代碼里,這樣可能會(huì)有內(nèi)存短缺的風(fēng)險(xiǎn),但如果要徹底的解決該問題就很花時(shí)間,且復(fù)雜。所以本系列不會(huì)太考慮這種事。

首先我們創(chuàng)建一個(gè)兩層指針 logger_list 用于存儲(chǔ)新生成的 logger,初始大小設(shè)定為8;

然后尋找最初的空閑空間

如果已經(jīng)沒有空間了,就加大空間,并將新增的空間設(shè)為NULL

如果一切狀態(tài)如常,就建立一個(gè)新的 logger


get_logger

如果沒有 logger 那就創(chuàng)建 logger


kill_logger

刪除特定 logger


kill_all_logger

清空 logger


display_char

If a switch contains more than five items, it's implemented using a lookup table or a hash list. This means that all items get the same access time, compared to a list of if:s where the last item takes much more time to reach as it has to evaluate every previous condition first.

雖然現(xiàn)在的編譯器已經(jīng)進(jìn)化到了能夠把爛代碼優(yōu)化到神代碼,但我?guī)讉€(gè)理由不選擇用 if-else

  1. 判斷具備離散性:是1就是1,是2就是2,不存在1和2之間的情況

  2. 顯而易見的易讀性

  3. switch方法只會(huì)讀取一次 c 變量,在大量的判斷情況下速度會(huì)優(yōu)于 if-else


驗(yàn)證

把 main.c 修改

得到下列結(jié)果就是成功


用C語(yǔ)言制作一個(gè)編譯器 一 DEBUG的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
博兴县| 桐梓县| 陕西省| 和林格尔县| 昆山市| 苍溪县| 晋中市| 嵊州市| 河间市| 定边县| 林西县| 罗甸县| 天津市| 桂林市| 神木县| 津南区| 巢湖市| 孝义市| 通州市| 封丘县| 丘北县| 房山区| 开鲁县| 上饶市| 西峡县| 尼勒克县| 崇明县| 罗山县| 英德市| 马关县| 香港| 九龙县| 陇南市| 台湾省| 肃宁县| 崇明县| 蒙城县| 乌海市| 河曲县| 宜兰县| 江安县|