为什么在函数块中定义枚举可能是一个不好的做法?

时间:2019-06-17 12:47:16

标签: c enums embedded

我已经编写了一个状态流处理程序,为减少在状态流处理程序之外使用状态流枚举的风险,我在函数bloc内定义了状态流枚举。

我的代码如下:

static void RequestHandler(bool isThisRequestANewRequest)
{
    typedef enum
    {
        STATE_NEW_REQUEST,
        STATE_1,
        STATE_2,
        STATE_ERROR,
    } States;

    static States  state = STATE_ERROR;

    if(isThisRequestANewRequest == true)
    {
        state = STATE_NEW_REQUEST;
    }

    switch(state)
    {    
        case STATE_NEW_REQUEST:
            //init request flags
            state = STATE_1;
            //lint -fallthrough
        case STATE_1:
            //do something
            break;
        case STATE_2:
            //do something else
            break;
        case STATE_ERROR:
        default:
            //do something in case of error
            break;
     }
}         

这可以算是一种好习惯吗?有没有风险?有什么缺点吗? (维护,阅读...)

我的一个同事告诉我这不是,但我正在等待基于事实的答案,而不仅仅是原始意见。

注意:我的问题适用于单线程和多线程任务。

1 个答案:

答案 0 :(得分:4)

通常,尽可能缩小范围是一种好习惯。如果您想对此进行某种形式的规范引用,我能想到的最接近的是MISRA-C:2012,规则8.9,建议仅在块范围内声明仅由单个函数使用的对象。我不明白为什么同样的不适用于类型。

但是,在switch语句中依赖掉线是不明智的做法,因为这会阻止静态分析器(在这种情况下为Lint)查找由丢失<div class="row"> <div class="col-md-3"> <div class="sidenav"> {% for sub_cat in sub_cats %} <button class="dropdown-btn"> {{ sub_cat.sub_cat_title }} <i class="fa fa-caret-down"></i> </button> <div class="dropdown-container"> {% for subsub_cat in subsub_cats %} <a href="#">{{ subsub_cat.subsub_cat_title }}</a> {% endfor %} </div> {% endfor %} </div> </div> <div class="col-md-9"> <h2>Learn Python</h2> <p> Authoritatively .... </p> </div> 引起的实际错误。这也使代码更难于阅读和维护-我个人认为直通式转换的实践要比代码重复性差得多。

如果要在每个函数调用中执行多个状态,请考虑使用简单的break语句:

if

否则,如果每个函数调用仅执行一个状态,则可以使用if(state == STATE_NEW_REQUEST) { ... state = STATE_1; } if(state == STATE_1) { ... } 。通常,“每个状态执行几个状态”的需求暗示着可以改进更广泛的程序设计。