Jon*_*age 60 c++ if-statement coding-style constants
我正在查看我正在使用的硬件接口的一些示例C++代码,并注意到以下几行中的许多语句:
if ( NULL == pMsg ) return rv;
Run Code Online (Sandbox Code Playgroud)
我敢肯定我听过有人说将常数放在第一位是一个好主意,但为什么呢?是否只是如果你有一个大的声明,你可以很快看到你正在比较什么,或者还有更多吗?
小智 30
阻止你写作:
if ( pMsg = NULL ) return rv;
Run Code Online (Sandbox Code Playgroud)
因为失误.一个好的编译器会警告你这一点,所以大多数人不会使用"常量优先"的方式,因为他们发现很难阅读.
它会停止single = assignment bug.
例如,
if ( NULL = pMsg ) return rv;
Run Code Online (Sandbox Code Playgroud)
不会编译,在哪里
if ( pMsg = NULL) return rv;
Run Code Online (Sandbox Code Playgroud)
会编译并让你头疼
为了澄清我在一些注释中所写的内容,这里有一个不在 C++代码中执行此操作的原因.
有人写了一个字符串类,并决定将一个强制转换运算符添加到const char*:
class BadString
{
public:
BadString(const char* s) : mStr(s) { }
operator const char*() const { return mStr.c_str(); }
bool operator==(const BadString& s) { return mStr == s.mStr; }
// Other stuff...
private:
std::string mStr;
};
Run Code Online (Sandbox Code Playgroud)
现在有人盲目地应用constant == variable"防御性"编程模式:
BadString s("foo");
if ("foo" == s) // Oops. This compares pointers and is never true.
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
这是IMO,比意外分配更隐蔽的问题,因为你无法从呼叫网站告诉任何事情显然是错误的.
当然,真正的教训是:
但有时你正在处理你无法控制的第三方API.例如,_bstr_tWindows COM编程中常见的字符串类受此缺陷的影响.
| 归档时间: |
|
| 查看次数: |
7711 次 |
| 最近记录: |