哪种条件最能容忍良好做法?

Which condition condones best to good practice?

本文关键字:条件      更新时间:2023-10-16

我正在重构旧代码,因此在我这样做时尝试遵循最佳实践。

我的真实案例类似于以下示例:

#define FOO 0x0001
long bar = 0;

我应该这样测试吗:

if(bar & FOO)

或者像这样:

if(bar == FOO)

看到评论后,我正在编辑以清除内容:

bar可以是任何有效的long号。我正在尝试测试bar是否等于FOO,而不是是否设置了标志FOO

再一次,我试图遵循最佳实践,因此问题。

对我来说,这似乎没有显着差异,但想与专家核实。

我仅限于使用VS 2019的Windows,如果需要更多信息,请随时询问。

谢谢。

这两者传达了不同的含义。x==y的意思是">检查x是否完全等于y",x&y的意思是">检查y中的任何位是否设置在x"。

结果是一样的,但如果FOO会改变呢?如果我来了,5年FOO改为3年,x=1仍然有效吗?

此外,在现代C++中,您应该避免使用宏。constexpr unsigned FOO = 1;是类型安全的。

如果你真的关心使用现代 c++ 的最佳实践,一开始就不要使用宏。您可以将其替换为constconstexpr

使用constconstexpr表达式后,表达式将变得简单。

if(something_const == something_non_const)

您可以随时参考 http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines.html 以获取核心 cpp 指南。

这在很大程度上取决于您要测试的内容。如果bar是一组标志,并且您想检查是否设置了其中一个标志 - 即FOO- 那么请使用:

if (bar & FOO) ;

如果要检查是否仅设置了FOO,请继续:

if (bar == FOO) ;

所以主要要点是 - 在代码中揭示您的意图。

此外,我会重新考虑使用long作为标志集的类型。有一种类型在语义上是IMO伟大的std::bitset表明您正在处理设置的标志。