如果有条件,多行的良好C编码样式

En *_* Kt 3 c if-statement lines conditional-statements

我正在用C语言编写一个项目,但遇到一个问题:我有很多if条件,其他人可能很难阅读。我还没有在互联网上找到类似的问题。

您是否有想法或示例如何使我的代码更具可读性?

这是C代码:

if( ((g_cycle_cnt == uartTxSecondaryMsg[3][msgPos[3]].sliceNo) ||   //correct slicenumber...
    (uartTxSecondaryMsg[3][msgPos[3]].sliceNo == -1) ||             // or as fast as possible...                                            

  ( (uartTxSecondaryMsg[3][msgPos[3]].sliceNo == -2) &&
   ((uartTxSecondaryMsg[3][msgPos[3]].timeFrameBegin>=g_uptime_cnt) && 
    (uartTxSecondaryMsg[3][msgPos[3]].timeFrameEnd<=g_uptime_cnt)))) &&

   ((dataProcessingFlag & SECONDARY_MSG_ANNOUNCED_CH4) == SECONDARY_MSG_ANNOUNCED_CH4) )
Run Code Online (Sandbox Code Playgroud)

Sci*_*cis 5

创建具有指示性名称的功能,这些功能性名称可以检查需求并表示其含义,例如:

if( is_correct_slice_number(/*... params here ... */) || 
    is_asap(/*... params here ... */)  || 
    is_other_condition(/*... params here ... */))
Run Code Online (Sandbox Code Playgroud)

或遵循相同逻辑的建议宏,例如:

if( IS_CORRECT_SLICE_NUMBER(/*... params here ... */) || 
    IS_ASAP(/*... params here ... */)  || 
    IS_OTHER_CONDITION(/*... params here ... */))
Run Code Online (Sandbox Code Playgroud)

我认为这可能使您的意图更加明确。


abl*_*igh 5

如果您想坚持使用现有代码(而不是将内容分解为内联函数),而只是修改缩进,我非常喜欢indent始终如一地使用。这意味着您可以修复任何源文件。

它的默认选项为您提供 GNU 缩进,即:

if (((g_cycle_cnt == uartTxSecondaryMsg[3][msgPos[3]].sliceNo) ||       //correct slicenumber...
     (uartTxSecondaryMsg[3][msgPos[3]].sliceNo == -1) ||        // or as fast as possible...
     ((uartTxSecondaryMsg[3][msgPos[3]].sliceNo == -2) &&
      ((uartTxSecondaryMsg[3][msgPos[3]].timeFrameBegin >= g_uptime_cnt) &&
       (uartTxSecondaryMsg[3][msgPos[3]].timeFrameEnd <= g_uptime_cnt)))) &&
    ((dataProcessingFlag & SECONDARY_MSG_ANNOUNCED_CH4) ==
     SECONDARY_MSG_ANNOUNCED_CH4))
  {
    /* do something */
  }
Run Code Online (Sandbox Code Playgroud)

我会说这里的问题实际上是你在数组中难以辨认。至少,考虑一下:

uartTxSecondaryMsg[3][msgPos[3]]
Run Code Online (Sandbox Code Playgroud)

成一个单独的变量,例如:

whatever *foo = &uartTxSecondaryMsg[3][msgPos[3]];
if (((g_cycle_cnt == foo->sliceNo) ||   //correct slicenumber...
     (foo->sliceNo == -1) ||    // or as fast as possible...
     ((foo->sliceNo == -2) &&
      ((foo->timeFrameBegin >= g_uptime_cnt) &&
       (foo->timeFrameEnd <= g_uptime_cnt)))) &&
    ((dataProcessingFlag & SECONDARY_MSG_ANNOUNCED_CH4) ==
     SECONDARY_MSG_ANNOUNCED_CH4))
  {
    /* do something */
  }
Run Code Online (Sandbox Code Playgroud)

显然,为 选择合适的类型和变量名foo

然后,您可以将if语句的各个部分分成单独的函数,每个函数都foo作为参数。