c语言取一个数中指定位,C语言在linux内核中do while(0)妙用之法

为什么说do while(0) 妙?因为它的确就是妙,而且在linux内核中实现是相当的妙,我们来看看内核中的相关代码:

#define db_error(fmt, ...) \

do { \

fprintf(stderr, "(error): "); \

fprintf(stderr, fmt, ##__VA_ARGS__); \

} while (0)

这只是个普通的调试信息的输出,有人便会认为,你这不是多此一举吗?去掉do while(0)不一样也实现了吗?其实不然,我们看看例子就清楚了,尽管很简单:

int main(void)

{

while(0)

{

printf("hello world\n");

}

do

{

printf("hello world1\n");

}while(0);

return 0 ;

}

这是一段简单到不能再简单的代码了,但还是要提一下,请看运行结果:

谁都知道第一个while(0)肯定是不会运行的,因为while()括号中的数值等于0,逻辑判定为假,即代码块中的hello world不会运行,但是do while(0)就不一样了,do while(0)即使条件不成立,也会拼了老命的去执行一次!

也就是说,为什么内核代码要这样来做,这是因为内核代码采用do{}while(0);这种结构可以保证无论在什么地方都可以正确的执行一次 ,这就是它用得最妙的地方,否则有时候调试程序的时候,单单的调试语句写了没打印其实是很正常的事情,不知道大家写代码的时候有没有遇到过,反正我是遇到过了,后来就是用这样的一种方法定位到错误点,顺利改正。

44b51fca178f2bec752e7f6fc57287f4.png

代码虽简单,但是用好用精熟练使用不一定什么时候都能想得到,越简单的东西,有时候,适用价值还是很好的!

L3Byb3h5L2h0dHAvc3RhdGljLmJsb2cuY3Nkbi5uZXQveGhlZGl0b3IveGhlZGl0b3JfZW1vdC9kZWZhdWx0L2xhdWdoLmdpZg==.jpg

分享以下我实现的调试输出程序,以后可以拿来当模版开发了:

#include

#include

//内核代码采用do{}while(0);这种结构可以保证无论在什么地方都可以正确的执行一次

#define db_error(fmt, ...) \

do { \

fprintf(stderr, "(error): "); \

fprintf(stderr, fmt, ##__VA_ARGS__); \

} while (0)

#define db_msg(fmt, ...) \

do { \

fprintf(stdout, "(msg): "); \

fprintf(stdout, fmt, ##__VA_ARGS__); \

} while (0)

#define db_warn(fmt, ...) \

do { fprintf(stdout, "(warn): "); \

fprintf(stdout, fmt, ##__VA_ARGS__); \

} while (0)

#define db_debug(fmt, ...) \

do { \

fprintf(stdout, "(debug): "); \

fprintf(stdout, fmt, ##__VA_ARGS__); \

} while (0)

int main(void)

{

db_error("h\n");

db_warn("e\n");

db_debug("llo\n");

return 0 ;

}

运行结果:

调试信息在前,很快就可以知道在什么地方打印的语句,方便DEBUG!迅速找到程序bug的定位!

b2ae231286863af8073ae9e19ca00bfd.png

go例子(一) 使用go语言实现linux内核中的list_head

package list 代码 package list import ( "fmt" ) // 数据接口 type ElemType interface{} // 节点 type ...

linux内核中的C语言常规算法(前提:你的编译器要支持typeof和type)

学过C语言的伙伴都知道,曾经比较两个数,输出最大或最小的一个,或者是比较三个数,输出最大或者最小的那个,又或是两个数交换,又或是绝对值等等,其实这些算法在linux内核中通通都有实现,以下的代码是我从 ...

嵌入式C语言自我修养 01:Linux 内核中的GNU C语言语法扩展

1.1 Linux 内核驱动中的奇怪语法 大家在看一些 GNU 开源软件,或者阅读 Linux 内核.驱动源码时会发现,在 Linux 内核源码中,有大量的 C 程序看起来“怪怪的”.说它是C语言吧, ...

Linux内核中的fastcall和asmlinkage宏

代码中看见:#define _fastcall 所以了解下fastcall -------------------------------------------------------------- ...

C语言之linux内核实现最大公约数算法

最大公约数算法,又称欧几里德算法,至今已有几千年的历史了.在我们开始学习C语言的时候最常用的算法就是辗转相除法,其实在linux内核中,内核也是使用这样的方法实现两数最大公约数的计算. 两个整数的最大 ...

调皮的程序员:Linux之父雕刻在Linux内核中的故事

本文内容由公众号“格友”原创分享. 1.引言   (不羁的大神,连竖中指都这么帅) 因为LINUX操作系统的流行,Linus 已经成为地球人都知道的名人.虽然大家可能都听过钱钟书先生的名言:“假如你吃 ...

Linux 内核中的 GCC 特性

https://www.ibm.com/developerworks/cn/linux/l-gcc-hacks/ GCC 和 Linux 是出色的组合.尽管它们是独立的软件,但是 Linux 完全依靠 ...

linux内核中GNU C和标准C的区别

linux内核中GNU C和标准C的区别 今天看了一下午的linux内核编程方面的内容,发现linux 内核中GNU C与标准C有一些差别,特记录如下: linux 系统上可用的C编译器是GNU C编 ...

Linux 内核中的 Device Mapper 机制

本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...

随机推荐

Struts2配置Result(Struts2_result)

一.概要 二.常用四种类型的配置 Struts.xml <?xml version="1.0" encoding="UTF-8" ?>

E文阅读

Lesson 9 A cold welcome 冷遇 What does 'a cold welcome' refer to?On Wednesday evening, we went to the ...

JS 鼠标事件大全

一般事件 事件 浏览器支持 描述 onClick HTML: 2 | 3 | 3.2 | 4 Browser: IE3 | N2 | O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDb ...

aix installp软件包管理工具

软件可以安装成两种状态:applied和committed.Applied状态保存了原来以前版本的软件,它把以前版本存储在/usr/lpp/PackageName目录下.这种方式可以回滚到以前的软件版 ...

利用AndroidStudio开发java工程

1.新建一个project,或者如果你已经有project的话,那就直接新建一个module.注意选择Java library,然后下一步. 2.输入module的一些信息.点击finish.(在创建 ...

Odoo 强大的开源微信模块 oejia&lowbar;wx

详见:http://oejia.net/blog/2018/10/24/oejia_wx_v054.html oejia_wx Odoo 的微信模块,提供了对微信公众号.企业号(企业微信)及小程序的接 ...

Autohotkey常用命令

//输入密码#1::send test1234sleep 600send {enter}return //打开程序; win + t: open total cmd#t::IfWinNotExist ...

git 小轿车 开车了

1.2什么是版本库? 什么是版本库?版本库又名仓库,英文名repository,你可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时 ...

弄懂Kafka的消息流转过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值