水木社区手机版
首页
|版面-C++程序设计语言(CPlusPlus)|
新版wap站已上线
返回
1/1
|
转到
主题:“一个函数只有一个出口”,这军规是不是早过时了?
楼主
|
z16166
|
2022-05-05 10:44:39
|
展开
现在都用RAII,实际上可以从一个函数体的任何位置提前return掉,也不会导致leak。
现在习惯这种写法了(VC++要打开4165编译警告,防止在返回类型不是bool的函数中误用这个宏):
#pragma warning(1 : 4165)
#define CHECK(x) \
{ \
static_assert(std::is_same<decltype(x), bool>::value); \
\
if (!(x)) \
return false; \
}
bool SomeFunc() {
...
CHECK(SomeAction1());
...
CHECK(SomeAction2());
...
CHECK(SomeAction3());
return true;
}
--
修改:z16166 FROM 111.199.145.*
FROM 111.199.145.*
4楼
|
z16166
|
2022-05-05 16:17:06
|
展开
查了一下,好像是的
【 在 eggcar 的大作中提到: 】
: 这个军规是给C的吧
--
FROM 111.199.145.*
9楼
|
z16166
|
2022-05-05 21:46:49
|
展开
那你咋写这种提前return的?老老实实把每个 "if(!cond) return false;" 写完整?
【 在 DoorWay 的大作中提到: 】
: 宁可用这个,也不用这个宏
:
https://www.fluentcpp.com/2020/04/24/else-before-if/
: 当然哪个我也不会用。
--
FROM 111.199.145.*
11楼
|
z16166
|
2022-05-06 11:40:43
|
展开
有的逻辑就是比较复杂
一个简单的文件读取,都可能有3个左右的early return。
Rust里面还专门给这种带成功/失败的early return搞了个语法糖:? operator
这个帖子对early return总结得比较全面了,有些跟你的办法差不多:
https://medium.com/swlh/return-early-pattern-3d18a41bba8
【 在 DoorWay 的大作中提到: 】
: 提前return是对的。
: 多个入参(<5)判断,就是 &&,最多换行
: 多个前置业务判断,一般通过类的设计消除,一个是Create函数里进行复杂的初始化;二是通过多态(加策略模式)拆分各种业务,使每个子类及函数尽可能简单;
: ...................
--
FROM 111.199.145.*
12楼
|
z16166
|
2022-05-06 11:46:47
|
展开
给ASM/FORTRAN/C这种的
有人翻出了Dijkstra在1969年的原文:
https://softwareengineering.stackexchange.com/questions/118703/where-did-the-notion-of-one-return-only-come-from
而且原文的意思是函数总是返回到同一个地方,而不是从同一个return语句返回。
【 在 eggcar 的大作中提到: 】
: 这个军规是给C的吧
--
FROM 111.199.145.*
1/1
|
转到
选择讨论区
首页
|
分区
|
热推
BYR-Team
©
2010.
KBS Dev-Team
©
2011
登录完整版