1

我正在用 Visual C++ 编写一个相当大的项目,我想知道是否有办法清理当前看起来像这样的错误检查代码:

// A header full of error codes like this
#define NO_ERROR            0x0000
#define CASUAL_ERROR        0x0001
#define ERROR_IN_THE_MATRIX 0x0015

-

// An example source file
int error;
error = openGLObj->Initialize();
if (!(error == NO_ERROR)
    return error;

如您所见,当您几乎在每次函数调用之后都必须编写一个错误检查代码时,它会占用大量屏幕空间。

所以我尝试了这样的事情:

// Second example source file
int error;
error = fbxParser->ParseVertexData(...);
if (error)
    return error;

它似乎至少在 Visual C++ 中有效,因为如果没有错误,我总是返回 NO_ERROR (int 0),并且任何其他整数似乎都将布尔值设置为 true。

后者是正确的做事方式吗?或者我以后会遇到问题并且必须花费数小时(再次)转换我的 if 语句?

4

3 回答 3

3

这主要是风格和个人喜好的问题。

我个人不喜欢将可以具有多个有意义的非零值的表达式视为条件。例如,我会写:

如果(指针!= NULL)

而不是

如果(!ptr)

即使两者的意思完全相同。相反,如果表达式“逻辑上”的布尔值(无论它是否属于类型bool),我更喜欢直接将其用作条件:

if (isdigit(foo))

而不是

if (isdigit(foo) != 0)

和:

bool cond;
// ...
if (cond)
// or
if (!cond)

不是

if (cond == true)
if (cond == false)

所以在你的情况下,我会写:

if (error != NO_ERROR)
    return error;

(请注意,我使用的是!=运算符,而不是应用于运算符!的结果==)。

显式比较为读者提供了更多上下文来理解是什么error;您将其与NO_ERROR、 不与0、 或0.0、 或NULL、 或进行比较'\0'

如果error是纯布尔值,我会写if (error).

正如我所说,这是个人喜好问题。鉴于您的定义,这:

if (error)

完全等同于:

if (error != NO_ERROR)

并且您可以依靠它按预期工作。语句中的条件if被隐式转换为bool,这本质上等同于比较它是否不等于0

因此,您不必担心if (error)行为不符合您的预期。对于现代编译器,您也不必担心编译器会为任何一种形式生成效率较低的代码。使用您认为更具可读性的任何内容。(不可写;请记住,代码的读取次数比写入次数要多得多。)

于 2013-03-27T18:07:17.037 回答
2

是的,布尔上下文中的整数/浮点数在非零时被解释为真。当指针不为空时,指针被解释为真。但请注意,您也可以写(error != NO_ERROR)而不是!(error == NO_ERROR).

通常异常和 RAII 习惯用法可以简化错误处理。它们可能比这些句法变化更有效。

于 2013-03-27T18:03:59.183 回答
1

假设 NO_ERROR 始终为零,那么您正在做的事情很好。

于 2013-03-27T17:57:52.827 回答