为什么“dangling-else”会发出警告?

问题描述 投票:0回答:1

我有一个程序。在程序的某个地方,我有这样的代码:

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
给出了类似的错误。

c if-statement gcc clang compiler-warnings
1个回答
0
投票

为什么“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
警告时,它会向您发出警告。

© www.soinside.com 2019 - 2024. All rights reserved.