万联芯城网站建设班级网站 建设模板

news/2025/9/22 20:41:31/文章来源:
万联芯城网站建设,班级网站 建设模板,自己做网站的难度,wordpress图片快速主题点击蓝字关注我们01.调试相关的宏在Linux使用gcc编译程序的时候#xff0c;对于调试的语句还具有一些特殊的语法。gcc编译的过程中#xff0c;会生成一些宏#xff0c;可以使用这些宏分别打印当前源文件的信息#xff0c;主要内容是当前的文件、当前运行的函数和当前的程序… 点击蓝字关注我们01.调试相关的宏在Linux使用gcc编译程序的时候对于调试的语句还具有一些特殊的语法。gcc编译的过程中会生成一些宏可以使用这些宏分别打印当前源文件的信息主要内容是当前的文件、当前运行的函数和当前的程序行。具体宏如下:__FILE__  当前程序源文件 (char*) __FUNCTION__  当前运行的函数 (char*) __LINE__  当前的函数行 (int)这些宏不是程序代码定义的而是有编译器产生的。这些信息都是在编译器处理文件的时候动态产生的。测试示例#include stdio.hint main(void) {printf(file: %s\n, __FILE__);printf(function: %s\n, __FUNCTION__);printf(line: %d\n, __LINE__);return 0; }02.# 字符串化操作符在gcc的编译系统中可以使用#将当前的内容转换成字符串。程序示例#include stdio.h#define DPRINT(expr) printf(main%s  %d\n, #expr, expr);int main(void) {int x  3;int y  5;DPRINT(x / y);DPRINT(x  y);DPRINT(x * y);return 0; }执行结果dengitcast:~/tmp$ gcc test.c  dengitcast:~/tmp$ ./a.out   mainx / y  0 mainx  y  8 mainx * y  15#expr表示根据宏中的参数(即表达式的内容)生成一个字符串。该过程同样是有编译器产生的编译器在编译源文件的时候如果遇到了类似的宏会自动根据程序中表达式的内容生成一个字符串的宏。这种方式的优点是可以用统一的方法打印表达式的内容在程序的调试过程中可以方便直观的看到转换字符串之后的表达式。具体的表达式的内容是什么有编译器自动写入程序中这样使用相同的宏打印所有表达式的字符串。//打印字符 #define debugc(expr) printf(char %s  %c\n, #expr, expr) //打印浮点数 #define debugf(expr) printf(float %s  %f\n, #expr, expr) //按照16进制打印整数 #define debugx(expr) printf(int %s  0X%x\n, #expr, expr);由于#expr本质上市一个表示字符串的宏因此在程序中也可以不适用%s打印它的内容而是可以将其直接与其它的字符串连接。因此上述宏可以等价以下形式://打印字符 #define debugc(expr) printf(char #expr  %c\n, expr) //打印浮点数 #define debugf(expr) printf(float #expr  %f\n, expr) //按照16进制打印整数 #define debugx(expr) printf(int #expr  0X%x\n, expr);总结#是C语言预处理阶段的字符串化操作符可将宏中的内容转换成字符串。03.## 连接操作符在gcc的编译系统中##是C语言中的连接操作符可以在编译的预处理阶段实现字符串连接的操作。程序示例#include stdio.h#define test(x) test##xvoid test1(int a) {printf(test1 a  %d\n, a); }void test2(char *s) {printf(test2 s  %s\n, s); }int main(void) {test(1)(100);test(2)(hello world);return 0; }上述程序中test(x)宏被定义为test##x, 他表示test字符串和x字符串的连接。在程序的调试语句中##常用的方式如下#define DEBUG(fmt, args...) printf(fmt, ##args)替换的方式是将参数的两个部分以##连接。##表示连接变量代表前面的参数列表。使用这种形式可以将宏的参数传递给一个参数。args…是宏的参数表示可变的参数列表使用##args将其传给printf函数.总结##是C语言预处理阶段的连接操作符可实现宏参数的连接。04.调试宏第一种形式一种定义的方式:#define DEBUG(fmt, args...)             \{                                   \printf(file:%s function: %s line: %d , __FILE__, __FUNCTION__, __LINE__);\printf(fmt, ##args);                \}程序示例#include stdio.h#define DEBUG(fmt, args...)             \{                                   \printf(file:%s function: %s line: %d , __FILE__, __FUNCTION__, __LINE__);\printf(fmt, ##args);                \}int main(void) {int a  100;int b  200;char *s  hello world;DEBUG(a  %d b  %d\n, a, b);DEBUG(a  %x b  %x\n, a, b);DEBUG(s  %s\n, s);return 0; }总结上面的DEBUG定义的方式是两条语句的组合不可能在产生返回值因此不能使用它的返回值。05.调试宏的第二种定义方式调试宏的第二种定义方式#define DEBUG(fmt, args...)             \printf(file:%s function: %s line: %d fmt, \__FILE__, __FUNCTION__, __LINE__, ##args)程序示例#include stdio.h#define DEBUG(fmt, args...)             \printf(file:%s function: %s line: %d fmt, \__FILE__, __FUNCTION__, __LINE__, ##args)int main(void) {int a  100;int b  200;char *s  hello world;DEBUG(a  %d b  %d\n, a, b);DEBUG(a  %x b  %x\n, a, b);DEBUG(s  %s\n, s);return 0; }总结fmt必须是一个字符串不能使用指针只有这样才可以实现字符串的功能。06.对调试语句进行分级审查即使定义了调试的宏在工程足够大的情况下也会导致在打开宏开关的时候在终端出现大量的信息。而无法区分哪些是有用的。这个时候就要加入分级检查机制可以定义不同的调试级别这样就可以对不同重要程序和不同的模块进行区分需要调试哪一个模块就可以打开那一个模块的调试级别。一般可以利用配置文件的方式显示其实Linux内核也是这么做的它把调试的等级分成了7个不同重要程度的级别只有设定某个级别可以显示对应的调试信息才会打印到终端上。可以写出一下配置文件[debug] debug_levelXXX_MODULE解析配置文件使用标准的字符串操作库函数就可以获取XXX_MODULE这个数值。int show_debug(int level) {if (level  XXX_MODULE){#define DEBUG(fmt, args...)             \printf(file:%s function: %s line: %d fmt, \__FILE__, __FUNCTION__, __LINE__, ##args)       }else if (...){....} }07.条件编译调试语句在实际的开发中一般会维护两种源程序一种是带有调试语句的调试版本程序另外一种是不带有调试语句的发布版本程序。然后根据不同的条件编译选项编译出不同的调试版本和发布版本的程序。在实现过程中可以使用一个调试宏来控制调试语句的开关。#ifdef USE_DEBUG#define DEBUG(fmt, args...)             \printf(file:%s function: %s line: %d fmt, \__FILE__, __FUNCTION__, __LINE__, ##args)   #else#define DEBUG(fmt, args...)#endif如果USE_DEBUG被定义那么有调试信息否则DEBUG就为空。如果需要调试信息就只需要在程序中更改一行就可以了。#define USE_DEBUG #undef USE_DEBUG定义条件编译的方式使用一个带有值的宏#if USE_DEBUG#define DEBUG(fmt, args...)             \printf(file:%s function: %s line: %d fmt, \__FILE__, __FUNCTION__, __LINE__, ##args)   #else#define DEBUG(fmt, args...)#endif可以使用如下方式进行条件编译#ifndef USE_DEBUG #define USE_DEBUG 0 #endif08.使用do…while的宏定义使用宏定义可以将一些较为短小的功能封装方便使用。宏的形式和函数类似但是可以节省函数跳转的开销。如何将一个语句封装成一个宏在程序中常常使用do…while(0)的形式。#define HELLO(str) do { \ printf(hello: %s\n, str); \ }while(0)程序示例int cond  1; if (cond)HELLO(true); elseHELLO(false);09.代码剖析对于比较大的程序可以借助一些工具来首先把需要优化的点清理出来。接下来我们来看看在程序执行过程中获取数据并进行分析的工具代码剖析程序。测试程序#include stdio.h#define T 100000void call_one() {int count  T * 1000;while(count--); }void call_two() {int count  T * 50;while(count--); }void call_three() {int count  T * 20;while(count--); }int main(void) {int time  10;while(time--){call_one();call_two();call_three();}return 0; }编译的时候加入-pg选项dengitcast:~/tmp$ gcc -pg  test.c -o test执行完成后在当前文件中生成了一个gmon.out文件。dengitcast:~/tmp$ ./test   dengitcast:~/tmp$ ls gmon.out  test  test.c dengitcast:~/tmp$使用gprof剖析主程序dengitcast:~/tmp$ gprof test Flat profile:Each sample counts as 0.01 seconds.%   cumulative   self              self     total           time   seconds   seconds    calls  ms/call  ms/call  name    95.64      1.61     1.61       10   160.68   160.68  call_one3.63      1.67     0.06       10     6.10     6.10  call_two2.42      1.71     0.04       10     4.07     4.07  call_three其中主要的信息有两个一个是每个函数执行的时间占程序总时间的百分比另外一个就是函数被调用的次数。通过这些信息可以优化核心程序的实现方式来提高效率。当然这个剖析程序由于它自身特性有一些限制比较适用于运行时间比较长的程序因为统计的时间是基于间隔计数这种机制所以还需要考虑函数执行的相对时间如果程序执行时间过短那得到的信息是没有任何参考意义的。将上诉程序时间缩短#include stdio.h#define T 100void call_one() {int count  T * 1000;while(count--); }void call_two() {int count  T * 50;while(count--); }void call_three() {int count  T * 20;while(count--); }int main(void) {int time  10;while(time--){call_one();call_two();call_three();}return 0; }剖析结果如下dengitcast:~/tmp$ gcc -pg test.c -o test dengitcast:~/tmp$ ./test   dengitcast:~/tmp$ gprof test Flat profile:Each sample counts as 0.01 seconds.no time accumulated%   cumulative   self              self     total           time   seconds   seconds    calls  Ts/call  Ts/call  name    0.00      0.00     0.00       10     0.00     0.00  call_one0.00      0.00     0.00       10     0.00     0.00  call_three0.00      0.00     0.00       10     0.00     0.00  call_two因此该剖析程序对于越复杂、执行时间越长的函数也适用。那么是不是每个函数执行的绝对时间越长剖析显示的时间就真的越长呢可以再看如下的例子#include stdio.h#define T 100void call_one() {int count  T * 1000;while(count--); }void call_two() {int count  T * 100000;while(count--); }void call_three() {int count  T * 20;while(count--); }int main(void) {int time  10;while(time--){call_one();call_two();call_three();}return 0; }剖析结果如下dengitcast:~/tmp$ gcc -pg test.c -o test dengitcast:~/tmp$ ./test   dengitcast:~/tmp$ gprof test Flat profile:Each sample counts as 0.01 seconds.%   cumulative   self              self     total           time   seconds   seconds    calls  ms/call  ms/call  name     101.69      0.15     0.15       10    15.25    15.25  call_two0.00      0.15     0.00       10     0.00     0.00  call_one0.00      0.15     0.00       10     0.00     0.00  call_three总结在使用gprof工具的时候对于一个函数进行gprof方式的剖析实质上的时间是指除去库函数调用和系统调用之外纯碎应用部分开发的实际代码运行的时间也就是说time一项描述的时间值不包括库函数printf、系统调用system等运行的时间。这些实用库函数的程序虽然运行的时候将比最初的程序实用更多的时间但是对于剖析函数来说并没有影响。*声明本文于网络整理版权归原作者所有如来源信息有误或侵犯权益请联系我们删除或授权事宜。戳“阅读原文”我们一起进步

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

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

相关文章

徐州网站建设新闻网站分站是怎么做的

在正文开始之前,请先来回答一下这个问题: 题目:输入为3个文件,a.txt 300MB,b.txt 100MB,c.txt 58.MB,使用MapReduce的example程序,计算Wordcount,请问,应该有多少个MapTask&#xf…

网站数据不变重新安装wordpress湖北微网站建设报价

本文资源来源自:中国新闻网转自公众号:科奖中心“创新的力量蕴藏在全社会之中,创新的资源理应向全社会开放。”全国政协委员,民盟中央常委、宁夏区委会主委冀永强近日接受中新社记者采访时表示,应积极鼓励探索“科研悬…

兰州网站建设多少钱创建免费网站需要的工具

1、数据仓库工作流调度 1.1 调度工具部署 工具部署链接 1.2 新数据生成 1.2.1 用户行为日志 1、启动日志采集通道,包括Kafka、Flume等 (1)启动Zookeeper zk.sh start(2)启动Kafka kf.sh start(3&…

高端品牌网站建设兴田德润在哪儿门户网站的建立

点击上方蓝字关注“汪宇杰博客”导语在我们生活的年代,博客并不稀奇,甚至可以说是随处可见。从最早的搜狐、新浪博客,再到每个人都曾记录青春的 QQ 空间,再到现在的 Vlog 与 Plog,似乎拥有一个自己的博客并不是什么难事…

网站如何优化关键词排名网站建设在线视频

引子: 最近在一篇文章中了解到EFF(电子前哨基金会)为了推广https协议,成立了一个letsencrypt项目,可以发放免费的证书,此证书可以被大多数主流浏览器所信任,这个邪恶的念头一爆发,就让我走上了一条坎坷的不…

题解:AT_agc052_c [AGC052C] Nondivisible Prefix Sums

题意:很简单了,不再赘述。 做法: 首先去掉一种很明显不行的方案即数的和为 \(P\) 的倍数,那不为 \(P\) 的倍数的有多少种呢? 因为不像正常的一样有 \(a_i=0\),不能说每次后面怎么填都有唯一一个对应,我们考虑记…

寻路算法

寻路算法 寻路算法核心特性对比总表算法 代价函数 f(n) 数据结构 是否保证最短路径? 优点 缺点 搜索行为比喻BFS (隐含 f(n) = g(n), 且权值=1) 队列 是 (等权图) 简单,保证最短路径(步数最少) 效率低,无方向性,…

2025年9月22日 - 20243867孙堃2405

今天我全天有课,早八是统一建模语言,第二节是算法与数据结构,下午只有一门课JAVA语言的学习,老师告诉我们要有一个设计的思路,主要的想法就是复杂问题简单化,就是把一个大问题分解成小而易解决的问题来完成

day 1

今天上课学了数据结构和java和统一建模语言,然后自学了并查集和二叉树,练了几道模板题,希望可以提升编码能力早日可以参加算法比赛。

东莞英文建站网站改备案

【来源】 题目3 : 活动中心 【分析】 本题採用的是三分法。 输入的一组点中找出左右边界。作为起始边界。 while(右边界-左边界<精度){将左右边界构成的线段均匀分成3段&#xff0c;推断切割点的距离关系&#xff0c;抹去距离大的一段。更新左右边界。 } 输出左(右)边界 【…

网站开发程序是什么建立免费空间网站

印刷电路板将布线区域划分成nm个方格如图a所示。精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案。在布线时&#xff0c;电路只能沿直线或直角布线&#xff0c;如图b所示。为了避免线路相交&#xff0c;已布了线的方格做了封锁标记&#xff0c;其它线路…

南京有哪些做网站的公司规范网站建设

在Python中调用C/C&#xff1a;cython及pybind11 转自&#xff1a;https://zhuanlan.zhihu.com/p/442935082 Python写起来非常方便, 但面对大量for循环的时候, 执行速度有些捉急. 原因在于, python是一种动态类型语言, 在运行期间才去做数据类型检查, 这样效率就很低(尤其是大规…

视频网站建设解决方案做照片书的模板下载网站

完全二叉树介绍完全二叉树应用场景完全二叉树和满二叉树的区别完全二叉树代码示例拓展 完全二叉树介绍 完全二叉树&#xff08;Complete Binary Tree&#xff09;是一种特殊的二叉树&#xff0c;它的定义是&#xff1a;如果设二叉树的深度为h&#xff0c;除第h层外&#xff0c…

网址大全2345色综合导航安徽seo网络优化师

netbeans 源文件这是一个偶然的帖子。 我一直在研究交易CDI观察者&#xff0c;并尝试使用嵌入式GlassFish对它进行一些集成测试。 但是令人惊讶的是&#xff0c;这种方法不能很好地工作&#xff0c;我仍在弄清楚&#xff0c;使用普通的嵌入式GlassFish时问题出在哪里。 同时&am…

学风建设网站版块wordpress 访客统计

目录 SQLite——DQL&#xff08;数据查询&#xff09; 数据集 select语句 条件查询 比较 确定范围 确定集合 like 查询记录 查询不重复的记录 排序和限制 排序 限制 聚合 聚合函数 语法 SQLite Group By详解 语法 实例 SQLite Having 子句 语法 实例 多…

天津网站建设制作开发公司平面设计师必看的网站

1.0 CSS介绍 CSS&#xff08;Cascading Style Sheet&#xff0c;层叠样式表)定义如何显示HTML元素。 当浏览器读到一个样式表&#xff0c;它就会按照这个样式表来对文档进行格式化&#xff08;渲染&#xff09;。 2.0 CSS语法 2.1 CSS实例 每个CSS样式由两个组成部分&#xff1…

[Paper Reading] METAGPT: META PROGRAMMING FOR A MULTI-AGENT COLLABORATIVE FRAMEWORK

目录METAGPT: META PROGRAMMING FOR A MULTI-AGENT COLLABORATIVE FRAMEWORKTL;DRMethodExperimentHumanEvalMBPP效果可视化总结与思考相关链接 METAGPT: META PROGRAMMING FOR A MULTI-AGENT COLLABORATIVE FRAMEWORK…

二进制 - 20243867孙堃2405

原码的表示分为 “符号位” 和 “数值位” 两部分,具体规则如下: 符号位:二进制数的最高位(最左边的位),用于表示正负: 符号位为 0 时,表示正数; 符号位为 1 时,表示负数。 数值位:除符号位外的其余位,直接…

建设网站要先给钱才能做英文网站怎么做外贸推广

是啊,有时候职场就是这么现实,你说你到一家公司能图啥,图它能让你享受累死累活的快感还是图他给你养老送终?还不是图那点工资,图能多学点东西在下一家公司开的高一点,多少人背井离乡不就为了博一个前程。 小蔡怎么说也算是陪公司从低谷爬起来的,至少也待了1、2年了,但是…

学习问题日记-1

学习Nginx时候,在Linux平台上安装Nginx时候遇到的问题报错。 已加载插件:fastestmirror Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&…