徐土豆
认证:优质创作者
所在专题目录 查看专题
用“位操作”取代“取模操作”判断奇数偶数
c语言运行时出现segment fault的原因
一文理解C语言中的volatile修饰符
C语言中的内存布局(memory layout)
do{}while(false)结构的妙用
const修饰符并不保证运行时的常数性质
作者动态 更多
大模型推理时的尺度扩展定律
17小时前
世界多胞体与世界模型
6天前
奖励模型中的尺度扩展定律和奖励劫持
1星期前
MeCo——给预训练数据增加源信息,就能减少33%的训练量并且提升效果
2星期前
DoReMi——一种通过代理模型估计大模型预训练最佳数据配比的方法
2星期前

do{}while(false)结构的妙用

本文转自徐飞翔的“do{}while(false)结构的妙用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

看源码的时候,发现某个框架的源码里面经常出现如下片段:

do{
	if (ASSERT(some_input_1) && ASSERT(some_input_2)) {
		...
	}
} while(false)

我对于do{} while(false)结构的使用,在此之前无非两种,第一种是基本用法,也就是把它当成循环结构使用,和for(;;)while(){}没太大区别;还有一种用法是用在宏定义中,如下所示:

#define LARGER(x,y) x > y? x:y

int a = 2 * LARGER(10,30);

此时我们本来期望a = 60,其实因为字符替代的原因,实际上是int a = 2 * x > y?x:y =30。这就是bug的源头之一。通过do{macro_code} while(false)结构,能对macro_code进行很好的分割。

然而,这个结构还有一个好处,其本质是一个循环结构,意味着它可以提前break,在多条件判断的环境下是一个作为对goto的很好的取代。如:

do {
	if (ASSERT(some_input_1) && ASSERT(some_input_2)) {
		ERR_LOG('log_info', pFile);
		break;
	}
	if (IS_EXIST(path)) {
		ERR_LOG('log_info', pFile);
		break;
	}
	// the residual code you need , the main stream
} while(false)

通过这种手段,基于作为入口条件判断,如果一旦不符合条件,可以直接break,跳到循环之外,这相当于很好地应用了goto的功能,而没有引入goto的负作用(全局跳转,难以维护)。

Reference

[1]. https://stackoverflow.com/questions/2314066/do-whilefalse

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 2
收藏 1
关注 52
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧