我倾向于通过Linux内核黑客攻击代码,主要做清洁补丁。最近我遇到了一些不同的if语句,其中包含语句的条件部分内的变量赋值。
if (!strcmp(filename, "-"))
cpio_list = stdin;
else if (!(cpio_list = fopen(filename,"r"))) {
...
...
}
checkpatch.pl称它为样式错误。以什么方式(我可以?)重构这段代码而不破坏它?
档案:linux/usr/gen_init_cpio.c
答案 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)
您需要清除所有错误编程习惯中的代码:
努力编写清晰,明确,自我记录的代码。
if (strcmp(filename, "-") == 0)
{
cpio_list = stdin;
}
else
{
cpio_list = fopen(filename,"r");
if(cpio_list == NULL)
{
// error handling
}
}