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(...)
#endifint 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

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

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

相关文章

类Copy方法:BeanUtils.copyProperties

类Copy方法&#xff1a;BeanUtils.copyProperties 需求场景 比如有时候我们想要把数据库里面的数据导出到excel表中&#xff0c;比如想要把数据库中的用户数据导出到excel表格中&#xff1b; 假设我们程序代码中与数据库对接的实体类是User&#xff0c;用于展示到前端的实体类…

浔川画板v5.0——浔川python科技社

浔川画板v5.0 本代码由浔川python社、浔川python科技社联合创作 # -*- coding: utf-8 -*- import tkinter as tk import tkinter.messagebox import pickle import random# 窗口 window tk.Tk() window.title(欢迎进入python) window.geometry(450x200) # 画布放置图片 # canv…

iOS cell的复用以及自定义cell

自定义cell以及cell复用的内容 文章目录 自定义cell以及cell复用的内容前言cell的复用原理cell的复用的两种不同方式自定义cell的实现总结 前言 cell是我们开发中的一个重要的控件&#xff0c;下面来讲解一下这个内容 cell的复用原理 cell的复用是UITableView的最核心的内容…

Fiddler抓包工具介绍

下载 下载:Web Debugging Proxy and Troubleshooting Tools|Fiddler 进去要填一个表 汉化版 百度网盘 请输入提取码 提取码&#xff1a;xq9t 下载过附件之后分别把两个文件 点开fiddler就ok了 配置https fiddler要想抓到https包(解密的),点击tools->options勾选三个对…

速盾:高防服务器防御 DDoS 攻击的掩护技巧

在当今互联网环境下&#xff0c;DDoS 攻击已成为网络安全的一大威胁&#xff0c;而高防服务器则是对抗这种攻击的重要手段。速盾作为提供高防服务器服务的品牌&#xff0c;在防御 DDoS 攻击方面有着独特的技巧和策略。 首先&#xff0c;速盾高防服务器采用了智能流量分析技术。…

总结之Docker(四)——镜像修改非ROOT用户权限后生成新镜像并发布

Docker拉去目标镜像 docker pull redis:6.2.5如果出现拉去过程超时&#xff0c;或者连接失败。 添加镜像加速器&#xff0c;以阿里云为例&#xff0c;阿里云目前推广提供镜像加速器&#xff0c;需要登录。 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 生成…

HMI(人机交互)应用的15大领域,欢迎补充。

HMI&#xff08;Human-Machine Interface&#xff0c;人机界面&#xff09;可以应用于许多不同的场景和行业&#xff0c;包括但不限于以下几个方面&#xff1a; 工业控制系统&#xff1a;HMI在工业生产中广泛应用&#xff0c;用于监控和控制生产过程。例如&#xff0c;工厂中的…

【OS】相关知识点收集

1 页面置换 页面置换算法是在计算机内存管理中用于决定哪些页面应该被替换出内存&#xff0c;以便为新的页面腾出空间的策略。以下是关于页面置换算法的详细回答&#xff0c;参考了多篇相关文章的信息。 1. 页面置换算法概述 页面置换算法主要应用于在存储体系当中&#xff…

NewStarCTF_RE(week1,2)

[NewStarCTF 2023 公开赛道]easy_RE ida 可能会把 一个数组或字符串拆开&#xff0c;可以通过计算地址&#xff0c;知道是一起的 也有的会藏在汇编窗口 Segments IDA的Segments窗口 &#xff1a;shiftf7 https://www.cnblogs.com/sch01ar/p/9477697.html ida 各种窗口也是需要…

技术周总结2024.06.10~06.16(AI Agent,Maven, Idea)

文章目录 一、06.14 周五1.1&#xff09;问题01&#xff1a;常见的 maven命令都有哪些&#xff0c;都怎么使用1. mvn clean2. mvn compile3. mvn test4. mvn package5. mvn install6. mvn deploy7. mvn clean install8. mvn dependency:tree9. mvn site10. mvn exec:java11. mv…

AMD平台,5600X+6650XT,虚拟机安装macOS 14(2024年6月)

AMD平台安装macOS 14的麻烦&#xff0c;要比Intel平台多的多&#xff0c;由于macOS从13开始&#xff0c;对CPU寄存器的读取进行了改变&#xff0c;导致AMD平台只要安装完macOS 13及以后版本&#xff0c;开机后就报五国语言错误&#xff0c;不断重启。改vmx文件&#xff0c;被证…

mongodb command

1. start and stop ./mongod --dbpath -dbpath /data/shard1/db --logpath -dbpath /data/shard1/db/logs/mongodb.log --fork mongod --shutdown --dbpath /data/shard1/db MongoDB基础篇-03-启动与关闭_mongodb启动和关闭-CSDN博客 2. 查看分片数据分布 mongo mongo01.c…

用React编写一个密码组件表单

theme: condensed-night-purple highlight: atelier-cave-light 背景介绍 我们在使用网站或者应用程序的登录界面或创建帐户界面时&#xff0c;往往避免不了需要用户输入密码这一步骤&#xff0c;而用户是否可以选择看见他们输入的密码是十分重要的一项功能。尤其是在当输入的…

Java面向对象-final关键字

Java面向对象-final关键字 一、final1、修饰变量2、修饰方法3、修饰类4、案例 一、final 可以修饰变量、方法、类 1、修饰变量 final修饰一个变量&#xff0c;变量的值不可以改变&#xff0c;这个变量就变成一个字符常量&#xff0c;约定俗称的规定&#xff1a;名字大写。 f…

大数据开发语言Scala入门 ,如何入门?

Ai文章推荐 1 作为程序员&#xff0c;开发用过最好用的AI工具有哪些&#xff1f; 2 Github Copilot正版的激活成功&#xff0c;终于可以chat了 3 idea,pycharm等的ai assistant已成功激活 4 新手如何拿捏 Github Copilot AI助手&#xff0c;帮助你提高写代码效率 5 Jetbrains的…

kotlin 中的字符

一、字符类型 1、kotlin中&#xff0c;字符用Char类型表示&#xff0c;值使用单引号 括起来。 fun main() {val a: Char 1println(a) // 1println("a类型为&#xff1a;${a.javaClass.simpleName}") // a类型为&#xff1a;char } 2、特殊字符的表示。 \t——制…

改进YOLO系列 | CVPR 2021 | Involution:超越convolution和self-attention的神经网络算子

Involution&#xff1a;超越卷积和自注意力的新型神经网络算子&#xff08;中文综述&#xff09; 简介 Involuton是CVPR 2021上提出的新型神经网络算子&#xff0c;旨在超越卷积和自注意力&#xff0c;提供更高效、更具表达力的特征提取能力。 Involution原理 Involution的…

【flink实战】flink-connector-mysql-cdc导致mysql连接器报类型转换错误

文章目录 一. 报错现象二. 方案二&#xff1a;重新编译打包flink-connector-cdc1. 排查脚本2. 重新编译打包flink-sql-connector-mysql-cdc-2.4.0.jar3. 测试flink环境 三. 方案一&#xff1a;改造flink连接器 一. 报错现象 flink sql任务是&#xff1a;mysql到hdfs的离线任务&…

IPTCP知识

1. IP&#xff1a; IP地址是一个32位的二进制数&#xff0c;通常被分割为4个“8位二进制数”IP地址分类&#xff1a;A类地址、B类地址、C类地址、D类地址、E类地址 A类地址分配给规模特别大的网络使用&#xff0c;B类地址分配给一般的中型网络&#xff0c;C类地址分配给小型网…

短URL服务设计

引言 在营销系统里&#xff0c;为了增加系统的活跃用户数&#xff0c;经常会有各种各样的营销活动。这类活动几乎都是为了充分利用存量用户的价值&#xff0c;促使他们分享产品或App以达到触达到更多用户的目的。又或者是出于营销目的&#xff0c;群发优惠券触达短信这种场景。…