c编译器学习07:minilisp编译器改造(debug模式支持调试)

问题

原版的minilisp编译器不支持argv输入测试,不方便单步调试。
代码改造目标是既不改变原有程序的各种功能,
又能支持个人习惯的vs单步debug模式。

CMakeLists.txt变更

定义DEBUG宏
解决单步调试源码定位偏差问题

cmake_minimum_required(VERSION 3.10)
project(minilisp)add_compile_options(-std=gnu99 -g -Wall)# Create executable
add_executable(minilisp minilisp.c)if(CMAKE_BUILD_TYPE STREQUAL "Debug")target_compile_options(minilisp PRIVATE -O0)target_compile_options(minilisp PRIVATE -DDEBUG)
else()target_compile_options(minilisp PRIVATE -O2)
endif()

源码变更

加两个变量

static char* g_arg = NULL;
static int g_pos = 0;

加两个函数my_getchar my_ungetc

将代码中getchar()替换为my_getchar()
ungetc(c, stream)替换为my_ungetc(c, stream)

static int my_getchar() {if (NULL == g_arg) {return getchar();}else {if (0 != g_arg[g_pos]) {return g_arg[g_pos++];}else {return EOF;}}
}static void my_ungetc(int c, FILE* stream) {if (NULL == g_arg) {ungetc(c, stream);}else {if (g_pos > 0) {--g_pos;}}
}

修改main函数

原版main函数改为main_函数
并在main_中加入以下判断

int main_(int argc, char** argv) {...// The main loopif (argc > 1) {//argv[1]printf("run by arg : %s\n", argv[1]);g_arg = argv[1];g_pos = 0;}else {printf("run by user input, eg:(+ 2 3)\n");}//stdinfor (;;) {...}
}

新增一个main函数

int main(int argc, char** argv) {if (argc > 1) {return main_(argc, argv);//debug release都支持带参数执行}else {
#ifdef DEBUGchar* argv_test[2] = { "./minilisp" ,"(+ 1 2)" };//debug时,支持单步调试
#elsechar* argv_test[1] = { "./minilisp" };//release时,等于原版
#endif // DEBUGreturn main_(sizeof(argv_test) / sizeof(char*), argv_test);}
}

debug release测试效果

在这里插入图片描述

单步debug效果

图中515这一行的原始代码是int c = getchar();
原版的会卡在getchar()这一行,执行不下去
程序会等待控制台输入一个字符
在这里插入图片描述

以上或许是一种c程序的改造范式,可复用。
这让我想起了,将exe改为dll,将dll改为exe,也是类似变更入口函数即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/699374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高级语言期末2012级B卷

1.编写函数&#xff0c;输出任意正整数n的位数&#xff08;n默认为存储十进制的整形变量&#xff09; 例如&#xff1a;正整数13&#xff0c;则输出2,&#xff1b;正整数3088&#xff0c;则输出4 #include <stdio.h>int func(int n) {int count0;while(n>0) {n/10;co…

免费的WP模板网站推荐

免费wordpress模板下载 高端大气上档次的免费wordpress主题&#xff0c;首页大图全屏显示经典风格的wordpress主题。 https://www.wpniu.com/themes/289.html wordpress免费企业主题 深蓝色经典实用的wordpress网站模板&#xff0c;用wordpress免费企业主题搭建网站。 http…

基于springboot+vue的安康旅游网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Day17_集合与数据结构(链表,栈和队列,Map,Collections工具类,二叉树,哈希表)

文章目录 Day17 集合与数据结构学习目标1 数据结构2 动态数组2.1 动态数组的特点2.2 自定义动态数组2.3 ArrayList与Vector的区别&#xff1f;2.4 ArrayList部分源码分析1、JDK1.6构造器2、JDK1.7构造器3、JDK1.8构造器4、添加与扩容5、删除元素6、get/set元素7、查询元素8、迭…

java基础-正则表达式+文件操作+内置包装类

目录 正则表达式去除字符串前后空格&#xff1a;去除每一行中首尾的空格去除开头的 数字_ 文件操作打印当前项目路径获取文件的上级目录/和\读取文件 内置包装类System类常用方法 Number类Integer类常用方法Float和Double 正则表达式 去除字符串前后空格&#xff1a; str.tri…

创建天花——Dynamo for Revit2022

今天我们来聊一个期待已久的功能——生成天花&#xff0c;经过了这么多年的迭代&#xff0c;Revit终于开放了生成天花的API&#xff0c;而且功能还不错&#xff0c;是经过优化的&#xff0c;不过目前我手里还没拿到SDK&#xff0c;就不截图了。 而且新增的天花API不是在Docume…

axios是如何实现的(源码解析)

1 axios的实例与请求流程 在阅读源码之前&#xff0c;先大概了解一下axios实例的属性和请求整体流程&#xff0c;带着这些概念&#xff0c;阅读源码可以轻松不少&#xff01; 下图是axios实例属性的简图。 可以看到axios的实例上&#xff0c;其实主要就这三个东西&#xff1a…

Sora是什么?

文章目录 前言Sora是什么&#xff1f;功能特色优点 缺点Sora模型的工作原理如何使用Sora模型Sora模型的应用场景Sora模型带来的问题虚假信息版权问题 后记 前言 Sora是美国人工智能研究公司OpenAI发布的一款令人惊叹的人工智能文生成视频大模型。近年来&#xff0c;人工智能技…

无人机基础技术,固定翼无人机动力系统技术详解,无人机飞行控制系统技术

推重比选择 推重比&#xff0c;是指无人机发动机推力/拉力与无人机飞行重力之比。该参数是衡量动力系统乃至整机性能的重要参数&#xff0c;很大程度上影响飞行性能。固定翼无人机的动力系统在配置时选择的推重比必须达到或超出设计的推重比。 重量要求 翼载荷是无人机单位面…

07 STL 简介

目录 什么是STLSTL的版本STL的六大组件STL的重要性如何学习STLSTL的缺陷 1. 什么是STL c标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构和算法的软件框架 2. STL的版本 原始版本 Alexander Stepanov、Meng Lee在惠普实验室的…

java: warning: source release 11 requires target release 11 解决办法

遇到问题 运行项目时报如下错 java: warning: source release 11 requires target release 11 原因&#xff1a;创建项目的时候选择的java11版本&#xff0c;现在用java8版本运行就会报这个错 查看项目的iml文件中LANGUAGE_LEVEL“JDK_xx”是多少 .iml 文件是 IntelliJ ID…

代码随想录算法训练营第四十一天|416. 分割等和子集。

416. 分割等和子集 题目链接&#xff1a;分割等和子集 题目描述&#xff1a; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 解题思路&#xff1a; 本题直接套用0-1背包问题确定以下四点 1、背包…

如何将建筑白模叠加到三维地球上?

​ 通过以下方法可以将建筑白模叠加到三维地球上。 方法/步骤 下载三维地图浏览器 http://www.geosaas.com/download/map3dbrowser.exe&#xff0c;安装完成后桌面上出现”三维地图浏览器“图标。 2、双击桌面图标打开”三维地图浏览器“ 3、点击“建筑白模”菜单&…

欢迎 Gemma: Google 最新推出开源大语言模型

今天&#xff0c;Google 发布了一系列最新的开放式大型语言模型 —— Gemma&#xff01;Google 正在加强其对开源人工智能的支持&#xff0c;我们也非常有幸能够帮助全力支持这次发布&#xff0c;并与 Hugging Face 生态完美集成。 Gemma 提供两种规模的模型&#xff1a;7B 参数…

浅拷贝导致的bug

错误代码&#xff1a; //初始化formTableData的值 const formTableData ref({saleOrderTime:,saleOrderDetails:[] });const showModal async (item) > {//调接口获取后端返回的数据let data (await api.searchSaleOrderById({saleOrderId:item.id})).dataconsole.log(&…

全流程点云机器学习(一)使用CloudCompare自制sharpNet数据集

前言 这不是高支模项目需要嘛&#xff0c;他们用传统算法切那个横杆竖杆流程复杂耗时很长&#xff0c;所以想能不能用机器学习完成这些工作&#xff0c;所以我就来整这个工作了。 工欲善其事&#xff0c;必先利其器&#xff0c;在正式开始之前&#xff0c;我们先要搞懂如何切…

旅游分享系列之:福建旅游攻略

旅游分享系列之&#xff1a;福建旅游攻略 一、漳州1.福建土楼2.云水谣3.四菜一汤景点 二、厦门1.园林博览苑2.海上自行车道3.山海步道4.海滩5.闽南菜6.落日 三、泉州1.衙口沙滩2.海上日出3.珞珈寺4.海滩烟花 一、漳州 游玩2个景点&#xff1a;云水谣&#xff0c;四菜一汤可以住…

基于Java+SpringBoot+Vue前后端分离仓库管理系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

QT常用类

五、常用类 QString 字符串类&#xff08;掌握&#xff09; QString是Qt的字符串类&#xff0c;与C的std::string相比&#xff0c; 不再使用ASCII编码。QString使用的是Unicode编码。 QString中每个字符都是一个16位的QChar&#xff0c;而不是8位的char。 QString完全支持中文&…

深入探究node搭建socket服务器

自从上篇中sokect实现了视频通话&#xff0c;但是是使用ws依赖库实现的服务端&#xff0c;所以最近再看ws源码&#xff0c;不看不知道&#xff0c;一看很惊讶。 接下来一点点记录一下&#xff0c;如何搭建一个简易的服务端socket&#xff0c;来实现上次的视频通讯。 搭建一个…