如何重新设置 C 代码的样式以从 if 语句条件中排除赋值

How to restyle C code to exclude assignments from if statement conditions

我倾向于通过 Linux 内核黑客来编写代码,主要是做清洁补丁。最近我遇到了一些不寻常的 if 语句,这些语句在语句的条件部分内包含变量赋值。

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

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

文件:linux/usr/gen_init_cpio.c

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

所以 cpio_list = fopen(filename,"r") 可以有效地用在表达式中,特别是作为条件。

有些人认为这会降低代码的可读性,并且更喜欢显式测试:

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

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

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

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

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

但是您可能想要重构一个函数,这样您就可以在 else.

之前 return

就我个人而言,我认为偶尔进行 assignment-in-if-condition 没什么大不了的,只要它被括号括起来(这意味着程序员的意思,它很明显,并且抑制了编译器警告)。

您需要清除所有不良编程习惯的代码:

  • 避免在条件内赋值,因为它往往会产生错误,有时会使代码更难阅读(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
      }
    }