首页 >> 行业

天天百事通!用C语言制作一个编译器 一 DEBUG

2023-02-17 20:05:09来源:哔哩哔哩

工欲善其事,必先利其器。在我们开始制作编程之前,我们要先制作一个简易的 Debug 工具。

预设

首先我们要先建立多个文件,结构如下

将 CMakeLists.txt 改为


(资料图片)

将 scripts/CMakeLists.txt 设为

将 scripts/helpers/CMakeLists.txt 设为

我们一切 debug 有关的程序都将集中到 logger 中编写

logger.h

以上是我的logger蓝图,设计上我参考了python中的logging模块

报告等级

我在这设计了四个报告等级,用于应对各种不同的状况

通常级:LOGGER_MESSAGE_LEVEL_INFO

诊断级:LOGGER_MESSAGE_LEVEL_DEBUG

警告级:LOGGER_MESSAGE_LEVEL_WARNING

致命级:LOGGER_MESSAGE_LEVEL_ERROR

为这四个报告等级,我定义了一个类别

这行代表类别 LOGGER_MESSAGE_FN 是一个函数指针。

它不会返回任何东西,它需要struct logger指针,一个String数据,以及各种其他变量

然后在 struct logger 里面添加四个函数通道

这样就可以实现

通用函数

该函数会返回一个struct logger的指针。

引用该函数时,系统会寻找是否已经存在同名的 logger,如果有就返回该 logger,反之创建新的 logger。

删除指定的 logger

void kill_all_logger();

删除全部的 logger

将一个字符转换成更加易读的文字

logger.c

在创建各种函数之前,我们需要引用一些模块以方便后续的编程

报告等级

首先我们需要制作一个简易的显示报告等级的函数,代码我就不赘述了

再来我们需要制作一个简易的报告函数

该函数用于输出数据到指定的流文件中,基本上什么文件都可以。

stderr 是系统预设用于输出错误的流文件。

va_list 是在C语言中解决变参问题的一组宏,在这情况我们能假设这里面已经存储了无限量的变量。

针对于 va_list 制作的输出函数,会结合 format 和 ap 中的数据生成格式化数据并将其输出到指定的流文件中。

然后写出四个通用函数

这四个函数都是同样的事情:读取潜在的无限变量,并引用 logger_message 函数

create_logger

考虑到不同的函数会引用同一个logger,所以我决定让logger以全局变量的形式出现在代码里,这样可能会有内存短缺的风险,但如果要彻底的解决该问题就很花时间,且复杂。所以本系列不会太考虑这种事。

首先我们创建一个两层指针 logger_list 用于存储新生成的 logger,初始大小设定为8;

然后寻找最初的空闲空间

如果已经没有空间了,就加大空间,并将新增的空间设为NULL

如果一切状态如常,就建立一个新的 logger

get_logger

如果没有 logger 那就创建 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.

虽然现在的编译器已经进化到了能够把烂代码优化到神代码,但我几个理由不选择用 if-else

判断具备离散性:是1就是1,是2就是2,不存在1和2之间的情况

显而易见的易读性

switch方法只会读取一次 c 变量,在大量的判断情况下速度会优于 if-else

验证

把 main.c 修改

得到下列结果就是成功

关键词: 首先我们 我们需要 通用函数

相关新闻