我有一个程序。在程序的某个地方,我有这样的代码:
int
read_n(char *cp, int n)
{
int nread;
if ((nread = read(STDIN_FILENO, cp, n)) != n)
if (nread == -1)
die(DIE_ERROR_FMT, "failed reading input");
else
return nread;
return n;
}
并像这样编译我的程序:
cc -std=c99 -Wall -Wextra -Wshadow -Wpedantic prog.c -o prog
我得到:
le.c:343:5: warning: add explicit braces to avoid dangling else [-Wdangling-else]
为什么这是一个警告,而且是必要的?我知道
else
会转到最近的 else
-less if
并且尽可能避免使用大括号(为了可读性)。这是 clang
,gcc
给出了类似的错误。
为什么“dangling-else”会发出警告?
因为有时这样的代码是错误编写的:
if (A)
if (B)
C;
else // Intended to apply to A but applies to B.
D;
编译器识别该模式,但无法确定是否存在错误,因此会向您发出警告。
这不太可能发生在简单的代码中,但请考虑:
if (A)
if (B)
{
Several dozen lines of code…
}
在这种情况下,稍后添加
else
的人在添加 else 时可能看不到中间的 if
。它可能会滚动到编辑器窗口之外。因此,当编译器看到此模式并且启用 dangling-else
警告时,它会向您发出警告。