C语言干货-#define为什么使用do while(0)

作者: 郭天祥老师分类: 科学科普 发布时间: 2024-04-24 16:49:13 浏览:34580 次

C语言干货-#define为什么使用do while(0)

happyyang的百草园:
c语言有趣(fanren)的地方就在这里:历史太长,多种范式共存。有人在讲三从四德,有人在讲及时行乐[doge]

蜂蜜橘子汁:
问题出在ifelse单行语句没有大括号,现在的编码规范 建议 即使只有一行也要用大括号括起来 这样就不存在这个问题了

【回复】宏的定义和使用可能是两个不同的程序员,一个程序员很可能无法要求另一个程序员必须按照他的规矩来。up的做法可以节省很多沟通时间,规避很多乱七八糟的问题。
【回复】确实,代规范一点能省很多事
【回复】感觉你这个才是正解,up只是把分号别扭的问题转移到宏定义里面了
echo_驊:
很多评论说什么加个花括号就可以,这些朋友可能没有去在指定的代码规范下进行编码的经历。 很多规范中,像if,for这类语句所控制的语句的所有分支均不超过一条时,不应该使用块语句进行封装。这是代码规范,为了保持规范一致性,do-while封装就是一个很好的方案。 此外,从设计的角度而言,一个这样的宏(其他特殊用法除外)不应该完成一条完整的语句,而是应该生成一个表达式,此时从外部封装来看使用一个分号作为结尾是合理的。 更严格一点,一个优良设计的宏的正确性决不应该依赖于外部是否使用一个{}进行块封装,否则这也就使宏的封装意义下降,并且被认为是设计不周全的。 评论区留言有不周到之处,望友好讨论[脱单doge]

【回复】回复 @real圣 : 个人觉得并不需要,因为do-while(0)对外部来讲就是一个宏函数封装,对外部来讲当成一个函数表达式来使用即可
【回复】但这个 do while 就是个典型的不良方案,多语句的定义应当以多语句的前提去使用。使用 do while 不具有强制性,使用方仍然需要查看原码来判断,结果对比不使用 do while 并不会减少任何心智负担。要么你就需要给宏增加新的规则,要在宏名上增加语法特征,并让ide去适配
君士坦丁堡路人甲:
十年不碰C了 现在还有人不知道inline吗[笑哭]

【回复】inline要看编译器心情啊,到底要不要inline是编译器决定的,你写了也不一定有用。
【回复】回覆 @彼女に言いそびれた :__attribute__((always_inline)) 但我是覺得這種強烈不建議
【回复】那你大概率不是做嵌入式的
鹰煮的范邦邦胤:
之前的代码怎么写,我就怎么写,要不然[doge]

【回复】有疑问的同学可以后台联系我哈
等缘123go:
以前也经常这么用,后面还是感觉封装成函数好用

挂神也想恋爱:
然而这种写法并不适用于z = FUNC(x, y);的形式 果然还是得inline才行[藏狐]

【回复】回复 @这就是后现代啊 :如果没有do while的话花括号里最后一个表达式输出值会传递给等号左边的变量[喜极而泣]
狗管理YY菌:
个人认为,宏的多条语句尽量用逗号表达式,别用do-while,逗号表达式还支持返回最后一个子表达式的值,do-while不行。要是逗号表达式无法完全的需要,那一般也不建议用宏,这个时候应该考虑定义成函数了。

【回复】({xxx;xxx;})gnu扩展,返回最后一个,也可以传入一个变量进来作为返回值
bWHenry:
强迫症一直觉得难受,这个看起来是多运行了两个指令,do和while条件判断?还是说编译器会足够聪明地把这个判断优化掉?

【回复】只要不是debug模式,这个dowhile一定会被优化
【回复】回复 @这货就很好 :离谱,优化理论上是不会改变语义的
犬來八荒_w:
有很多CHECK的宏都会这么做,这样一行后面加;

hero080:
除非你有特殊原因只能用纯C,否则用C++的话99.9%的#define可以用constexpr以及其它东西代替。

ID叫三七:
前天才看到有代码这样写,当时还好奇为啥这样写,今天就看到解释了[脱单doge]

C语言 电子工程师 define 代码编程

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!