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)
创建具有指示性名称的功能,这些功能性名称可以检查需求并表示其含义,例如:
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)
我认为这可能使您的意图更加明确。
如果您想坚持使用现有代码(而不是将内容分解为内联函数),而只是修改缩进,我非常喜欢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作为参数。