如何重新安排C代码以从if语句条件中排除赋值

时间:2015-04-28 06:16:51

标签: c linux linux-kernel coding-style kernel

我倾向于通过Linux内核黑客攻击代码,主要做清洁补丁。最近我遇到了一些不同的if语句,其中包含语句的条件部分内的变量赋值。

if (!strcmp(filename, "-"))
    cpio_list = stdin;
else if (!(cpio_list = fopen(filename,"r"))) { 
    ...
    ...
}

checkpatch.pl称它为样式错误。以什么方式(我可以?)重构这段代码而不破坏它?

档案:linux/usr/gen_init_cpio.c

4 个答案:

答案 0 :(得分:3)

拆分else if,以便您可以在if之前完成作业。

if (!strcmp(filename, "-"))
    cpio_list = stdin;
else {
        cpio_list = fopen(filename,"r")
        if (!cpio_list) { 
        ...
        ...
    }
}

但您可能想要重构一个函数,以便return之前只能else

就个人而言,我认为只要它有括号(这意味着程序员意味着它,它显而易见,并且抑制编译器警告),偶尔会有一个if-if-if条件并不是什么大问题。

答案 1 :(得分:1)

赋值表达式具有值。它的值是赋值后左操作数的值。

因此cpio_list = fopen(filename,"r")在表达式中有效,特别是作为条件。

有些人认为这会降低代码的可读性,并且更倾向于明确测试:

else if ((cpio_list = fopen(filename,"r")) != 0)

请注意,括号是必要的,因为=的优先级低于==!=

答案 2 :(得分:1)

if (!strcmp(filename, "-"))
    cpio_list = stdin;
else {
    cpio_list = fopen(filename,"r");
    if (! cpio_list) { 
        ...
    }
}

答案 3 :(得分:1)

您需要清除所有错误编程习惯中的代码:

  • 避免在条件内进行分配,因为它往往会产生错误,有时会使代码难以阅读(MISRA-C禁止在条件内进行分配)。
  • 不要使用布尔运算符来检查针对NULL的指针,或者检查0的整数。它会起作用但它没有任何意义并使代码更难阅读(也被MISRA-C禁止)。
  • 在每个语句后使用大括号以防止意外错误。
  • 努力编写清晰,明确,自我记录的代码。

    if (strcmp(filename, "-") == 0)
    {
      cpio_list = stdin;
    }
    else 
    {
      cpio_list = fopen(filename,"r");
      if(cpio_list == NULL)
      {
         // error handling
      }
    }