C语言之顺序结构以及程序调试的debug宏

一:C语言中的顺序结构

1:最浅显的顺序结构理解:三种结构之一

        (1)代码执行的时候没有遇到判断跳转或者循环,默认是顺序执行的。执行完上一句则开始执行下一句。

        (2)顺序结构说明cpu的工作状态,就是以时间轴来顺序执行所有的代码语句直到停止。

       

2:选择和循环结构的内部的顺序结构

        (1)譬如if()在 {}内部是if的代码段,在代码段内部还是按照顺序结构来执行的

        (2)switch case内部也是一样,也是按照顺序结构来执行的

        (3)while for 内部也是按照顺序结构来执行的

3:编译过程中的顺序结构

        (1)一个c程序有多个.c文件组成,编译的时候多个.c文件是独立分开编译的。每个c文件编译的时候,编译器是按照从前到后的顺序逐行进行编译的。

        (2)编译器编程时的顺序编译会导致函数/变量必须先定义/声明才能够被调用,这也是C语言中函数/变量声明的来源

        (3)链接过程中:链接过程连接器实际上是按照链接脚本指导下完成的。所以链接时的.o文件的顺序是由链接脚本指定的。如果链接脚本中明确指定了顺序则会 优先考虑这个规则按照这个指定的顺序排布,如果链接脚本中没有指定具体的顺序则链接器会自动的排布

4:思考:为什么本质上都是顺序结构

        (1)顺序结构本质上符合cpu的设计原理,cpu是人设计的,cpu也就符合人的思考原理

二:程序调试的debug宏

        1:程序调试的常见方案:单步调试、打印信息、log文件

                (1)利用调试器进行单步调试(譬如IDE中,jlink)适用于新手,最大的好处就是直观,能够帮助找到问题。缺点就是限制大速度慢

                (2)裸机使用LED、蜂鸣器等硬件测试,适合单片机裸机程序

                (3)printf函数打印调试,比较常用,作为程序员必须学会使用打印信息调试。好处是具备普遍性,几乎在所以情况下都能使用。

                (4)log文件(日志文件)是系统运行过程中在特定时候会打印一些调试信息,日志文件记录下来这些调试信息以供后续查找问题。适合于系统级或者大型程序的调试

        2:打印信息不能太多也不能太少

        (1)调试信息太少会找不到问题所在

        (2)调试信息太多会有大量无用的信息淹没有用的信息,导致有用的信息无法被看见,等于没有

        3:调试(DEBUG)版本和发行(RELEASE)版本的区别

                (1)DEBUG版本就是包含了调试信息的版本,在程序测试中会发布debug版本,这种版本的程序运行时会打印出来调试信息/log文件,这些信息可以辅助测试人员判断程序的问题所在

                (2)DEBUG版本的坏处是占用了系统的资源,拖慢了系统运行速度。因此DEBUG版本性能低于RELEASE版本

                (3)RELEASE版本就是最终的发布版本,相较于DEBUG版本的功能代码是一样的,但是去掉了所有的调试信息。适合最终 测试通过要发布的程序,因为去掉了调试信息所以程序的运行效率更高

                (4)DEBUG和RELEASE其实是一套源代码。源代码中其实是有很多打印调试信息的语句的,程序员是通过宏来完成条件编译的

        4:debug宏的实现原理

                (1)DEBUG的大概原理是:

                        

#ifdef DEBUG
#define dbg() printf()

#else 
#define dbg()

#endif

                (2)工作方式是 :如果需要输出DEBUG版本则在条件编译之前加上 #define DEBUG即可,这样程序中的调试语句dbg就会被替换成printf从而输出;如果要输出RELEASE版本则去掉#define DEBUG,则dbg() 就会被替换成空,则程序中所有的dbg()语句就蒸发了,这样的程序编译就会生成没有任何调试信息的代码

        5:debug宏的使用方法

               

//示例程序代码


#include <stdio.h>

#define DEBUG

#ifdef DEBUG

#define DBG(...) fprintf(stderr," DBG(%s,%s(),%d): ",_FILE_,_FUNCTION_,LINE_); 
fprintf(stderr, _VA_ARGS__)
#else
#define DBG(...)
#endif


int main(void)
{

    DBG("tiaoshi.\n");


    return 0;


}

有定义#define DEBUG程序运行结果:

无定义#define DEBUG程序运行结果: 无调试信息输出


 

 

  6:分析几个debug宏

                 (1)应用程序中的DEBUG宏

                      

#ifdef DEBUG

#define DBG(...) fprintf(stderr," DBG(%s,%s(),%d): ",_FILE_,_FUNCTION_,LINE_); 
fprintf(stderr, _VA_ARGS__)
#else
#define DBG(...)
#endif

注:_FILE_ 是C语言中的预定义宏,是C语言自己定义的这些宏具有特殊含义,譬如_FILE_就代表当前正在编译的c源文件名

                (2)内核中的debug

                        #ifdef DEBUG_S3C_MEM
                        #define DEBUG(fmt, args...) printk(fmt, ##args)
                        #else
                        #define DEBUG(fmt, args...) do {} while (0)
                        #endif

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot基于Web的社区医院管理服务系统 LW+ PPT+源码+讲解

3系统需求分析 3.1系统功能 通过前面的功能分析可以将社区医院管理服务系统的功能分为管理员、用户和医生三个部分&#xff0c;系统的主要功能包括首页、个人中心、用户管理、医生管理、预约医生管理、就诊信息管理、诊疗方案管理、病历信息管理、健康档案管理、费用信息管理…

【Linux】ss 命令使用详解

目录 一、ss命令介绍 二、ss命令格式和使用 1、命令格式 2、ss命令的常用选项 3、命令的常见用法 3.1 找出打开套接字/端口应用程序 3.2 检查系统的监听套接字 3.3 显示所有状态为established的SMTP连接 3.4 查看建立的 TCP 连接 3.5 通过 -r 选项解析 IP 和端口号 …

【YOLOv5/v7改进系列】引入特征融合网络——ASFYOLO

一、导言 ASF-YOLO结合空间和尺度特征以实现精确且快速的细胞实例分割。在YOLO分割框架的基础上&#xff0c;通过引入尺度序列特征融合(SSFF)模块来增强网络的多尺度信息提取能力&#xff0c;并利用三重特征编码器(TFE)模块融合不同尺度的特征图以增加细节信息。此外&#xff…

《Windows API每日一练》5.2 按键消息

上一节中我们得知&#xff0c;Windows系统的按键消息有很多类型&#xff0c;大部分按键消息都是由Windows系统的默认窗口过程处理的&#xff0c;我们自己只需要处理少数几个按键消息。这一节我们将详细讲述Windows系统的所有按键消息及其处理方式。 本节必须掌握的知识点&…

高清无字幕搞笑视频素材去哪里找哪里下载的?

在制作搞笑视频时&#xff0c;优质的无字幕视频素材对于提升作品的趣味性和吸引力至关重要。今天&#xff0c;我将为大家介绍一系列高清视频素材网站&#xff0c;这些网站不仅资源丰富、质量上乘&#xff0c;还能助你一臂之力&#xff0c;迅速提升视频的创意和品质。首先要推荐…

DP:完全背包+多重背包问题

完全背包和01背包的区别就是&#xff1a;可以多次选 一、完全背包&#xff08;模版&#xff09; 【模板】完全背包_牛客题霸_牛客网 #include <iostream> #include<string.h> using namespace std; const int N1001; int n,V,w[N],v[N],dp[N][N]; //dp[i][j]表示…

IDEA 学习之 打开一个 MAVEN 工程

目录 1. 单体工程2. 多 module 工程3. 多个多 module 工程3.1. 重复 1 步骤3.2. 添加其他多 module 工程 1. 单体工程 2. 多 module 工程 3. 多个多 module 工程 3.1. 重复 1 步骤 3.2. 添加其他多 module 工程

适合孩子学习用什么的落地灯?五款精品护眼大路灯分享

适合孩子学习用什么的落地灯&#xff1f;说到护眼落地灯&#xff0c;都会出现两种呼声&#xff1a;一种是认为是“智商税”&#xff0c;而另外一种则是妥妥的照明神器&#xff01;护眼大路灯到底是哪种定义呢&#xff1f;贵的护眼灯一定好吗&#xff1f; 这么年&#xff0c;护…

学习新语言方法总结(一)

随着工作时间越长&#xff0c;单一语言越来越难找工作了&#xff0c;需要不停地学习新语言来适应&#xff0c;总结一下自己学习新语言的方法&#xff0c;这次以GO为例&#xff0c;原来主语言是PHP &#xff0c;自学GO 了解语言特性&#xff0c;知道他是干嘛的 go语言&#xff0…

【JavaEE进阶】Spring统一功能处理:拦截器的使用

目录 1.什么是拦截器? 2.拦截器的使用 2.1定义拦截器 2.2 注册配置拦截器 3.拦截器详解 3.1 拦截路径 3.2 拦截器的执行流程 4. 使用拦截器实现登录校验 4.1 定义拦截器 4.2 注册配置拦截器 1.什么是拦截器? 拦截器是Spring框架提供的核心功能之⼀, 主要用来拦截用…

数据分析必备:一步步教你如何用matplotlib做数据可视化(8)

1、Matplotlib 条形图 条形图或条状图是一种图表或图形&#xff0c;它显示带有矩形条的分类数据&#xff0c;其高度或长度与它们所代表的值成比例。可以垂直或水平绘制条形。 条形图显示了离散类别之间的比较。图表的一个轴显示要比较的特定类别&#xff0c;另一个轴表示测量值…

【python】PyQt5初体验,窗口等组件开发技巧,面向对象方式开发流程实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

国外开源字典集(wordlists)

Assetnote Wordlists Wordlists that are up to date and effective against the most popular technologies on the internet.https://wordlists.assetnote.io/

windows系统停止更新办法

windows系统停止更新 双击启动下载的文件 然后再回到系统-更新这里&#xff0c;选择日期就行。

RK3568技术笔记十四 Ubuntu创建共享文件夹

单击“虚拟机”&#xff0c;单击“设置”&#xff0c;如图所示&#xff1a; 单击“选项”&#xff0c;选择“总是启用&#xff08;E&#xff09;”&#xff0c;单击“添加”&#xff0c;如图所示&#xff1a; 单击“下一步”&#xff0c;如图所示&#xff1a; 单击“浏览”添加…

4LPFA清洗桶带隔板ICP-MS分析清洗系统高洁净特氟龙清洗设备

小瓶清洗系统PFA清洗桶品牌&#xff1a;南京瑞尼克 材质&#xff1a;PFA 耐受温度范围&#xff1a;-200C~260C 小瓶清洗系统是清洗实验室器皿有效的方法。该清洗系统由高纯PFA材质制成&#xff0c;专为热浸泡清洗设计&#xff0c;与传统玻璃烧杯相比&#xff0c;更结实。该小…

【笔记】打卡01 | 初学入门

初学入门:01-02 01 基本介绍02 快速入门库处理数据集网络构建模型训练保存模型加载模型打卡-时间 01 基本介绍 MindSpore Data&#xff08;数据处理层&#xff09; ModelZoo&#xff08;模型库&#xff09; MindSpore Science&#xff08;科学计算&#xff09;&#xff0c;包含…

Chromium 调试指南2024 Mac篇 - 调试 Chromium(三)

1.引言 在完成了环境准备和成功编译Chromium之后&#xff0c;下一步就是进行调试工作。调试是软件开发过程中必不可少的环节&#xff0c;通过调试可以定位和修复代码中的问题&#xff0c;验证新功能的正确性&#xff0c;并确保整个项目的稳定性和高效性。 由于Chromium项目的…

【html】如何利用hbuilderX 开发一个自己的app并安装在手机上运行

引言&#xff1a; 相信大家都非常想开发一款自己的apk&#xff0c;手机应用程序&#xff0c;今天就教大家&#xff0c;如何用hbuilderX 开发一个自己的app并安装在手机上运行。 步骤讲解&#xff1a; 打开hbuilderX &#xff0c;选择新建项目 2.选择5app,想一个名字&#x…

每天写java到期末考试(6.21)--集合4--练习--6.20

练习1&#xff1a; 正常写集合 bool类 代码&#xff1a; import QM_Fx.Student;import java.util.ArrayList;public class test {public static void main(String[] args) {ArrayList<Student> listnew ArrayList<>();//2.创建学生对象Student s1new Student(&quo…