- 主题:怎么禁止函数返回值的bool和long之间的自动转换?
我这有的函数返回值是bool类型,有的是HRESULT类型。HRESULT是long类型的typedef。
混用可能会出现下面的错误。
本质是bool和long之间的隐式转换,不光返回值,实际上任何赋值、if判断的地方都可能出现这种隐式转换。
但主要关心的是return时的转换,因为我把return放在宏里面。
bool foo(){
...
return E_FAIL; // 会被转换成true
}
HRESULT bar() {
...
return false; //会被转换成S_OK
}
定义新的类型strong_bool、strong_long(或者strong_HRESULT),然后把对应函数的返回值bool、HRESULT声明改为strong_bool、strong_long,可以阻止这种隐式转换。
有没有其他的搞法?看了一下c++20的concept,貌似搞不了这种、只能搞函数的参数?
class strong_bool {
public:
explicit strong_bool(const bool rhs) : m_value{rhs} {}
template <typename T> strong_bool(T rhs) = delete;
operator bool() const { return m_value; }
private:
bool m_value;
};
strong_bool foo() { return E_FAIL; } // 编译失败
--
FROM 114.254.46.*
可以ClangTidy静态检查
readability-implicit-bool-conversion
--
FROM 222.129.48.*
3Q,这是个办法。
就是visual studio开了code analysis后错误比较多,直接编不过去,要费劲梳理一次才行。
vs默认不开code analysis,所以从没人关注过。
【 在 ble 的大作中提到: 】
: 可以ClangTidy静态检查
: readability-implicit-bool-conversion
--
FROM 114.254.46.*
警告当错误。
不过看代码现状,估计开了就一个月编不过……
指定类型警告当作错误
【 在 z16166 的大作中提到: 】
: 我这有的函数返回值是bool类型,有的是HRESULT类型。HRESULT是long类型的typedef。
: 混用可能会出现下面的错误。
: 本质是bool和long之间的隐式转换,不光返回值,实际上任何赋值、if判断的地方都可能出现这种隐式转换。
: ...................
--
FROM 61.185.186.*
使用类似rust那种代数类型,不返回bool
把返回值设计成一个error code和一个返回值的复合体
【 在 z16166 的大作中提到: 】
: 我这有的函数返回值是bool类型,有的是HRESULT类型。HRESULT是long类型的typedef。
: 混用可能会出现下面的错误。
: 本质是bool和long之间的隐式转换,不光返回值,实际上任何赋值、if判断的地方都可能出现这种隐式转换。
: ...................
--
FROM 125.33.247.*
是个很好的思路
【 在 Bernstein 的大作中提到: 】
: 使用类似rust那种代数类型,不返回bool
: 把返回值设计成一个error code和一个返回值的复合体
:
--
FROM 114.254.46.*
对,目前应该是搞不了,同一个project里各人的代码处于基本不讲究的阶段
【 在 DoorWay 的大作中提到: 】
: 警告当错误。
: 不过看代码现状,估计开了就一个月编不过……
: 指定类型警告当作错误
--
FROM 114.254.46.*
有啥搞不了的,就看项目执行力度。
我司几千万行的代码,不仅编译不能有warnning,连lint都不能告警。
【 在 z16166 的大作中提到: 】
: 对,目前应该是搞不了,同一个project里各人的代码处于基本不讲究的阶段
:
: 【 在 DoorWay 的大作中提到: 】
: ...................
--来自微微水木3.5.12
--
FROM 223.167.169.*
几千万行,那是巨无霸公司了,有明确的惩罚规定、有专人盯着就好办
俺这是小team,先山寨着、苟着,以业务功能从0到1的实现为主,等我忍不了时搞一下。现在连头文件的预编译都没搞,哈哈
【 在 KillnCov 的大作中提到: 】
: 有啥搞不了的,就看项目执行力度。
: 我司几千万行的代码,不仅编译不能有warnning,连lint都不能告警。
:
--
FROM 114.254.46.*