【问题标题】:If error then switch vs. switch with "good" case如果错误,则切换与切换“好”案例
【发布时间】:2010-10-03 14:54:46
【问题描述】:

我对机器代码不是很熟悉,但我认为这是一个非常简单的问题。
如果我想通过从函数返回的整数进行错误处理(而不是抛出异常的函数),从机器代码的角度来看,这样做是否更好:

  1. 检查条件语句中的整数是否存在“错误”值,然后使用 switch 语句处理“错误”值,或者
  2. 切换整数,并为“好”值和“坏”值提供案例

例如,在 C++ 中:

enum error_code {E_GOOD, E_BAD, E_UGLY};
error_code func_b();

选项 1

void func_a()
{
    error_code err_catch = func_b();

    if (err_catch)
    {
        switch (err_catch)
        {
        case E_BAD:
            /* Handle bad case */
            break;
        case E_UGLY:
            /* Handle ugly case */
            break;
        }
    }
}

选项 2

void func_a()
{
    error_code err_catch = func_b();

    switch (err_catch)
    {
    case E_GOOD:
        break;
    case E_BAD:
        /* Handle bad case */
        break;
    case E_UGLY:
        /* Handle ugly case */
        break;
    }
}

感谢您的帮助。

【问题讨论】:

    标签: coding-style switch-statement case


    【解决方案1】:

    第一个测试应该是:

    if (err_catch != E_GOOD)
    

    这是明确的“发生错误”。顺便说一句,您的代码看起来正在通过 C++ 编译器。 C 不会用前面的enum 创建类型error_code;您必须添加:

     typedef enum error_code error_code;
    

    两者在生成的代码方面差别很小。

    我可能会使用选项 1(if 表示法)只是为了明确开关只处理错误情况(因为它只需要处理错误情况),但如果它被提交给我进行代码审查。

    【讨论】:

    • 啊,是的,忘了 C 不会自动执行 typedef s。对 C++ 的小改动。
    【解决方案2】:

    对于enum 类型,我会直接使用switch 语句,以便编译器可以确保switch 语句真正处理所有可能的值。

    【讨论】:

    • 既然你提到了这一点,我记得编译器抱怨没有在检查它的switch 中使用enum 值之一,奇怪的是它是E_GOOD 值。这是在catch 块中,所以我没有理由提供E_GOOD 案例,但编译器仍然警告它。
    猜你喜欢
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多