2

我想铿锵有力地捕捉到我无意中的“切换”语句失败。这个 shell 脚本演示了我的失败;我在脚本本身之后显示输出。我究竟做错了什么?

#!/bin/sh

cat <<EOD > 1.c
#include <stdio.h>
int main(void)
{
  int etwas=5;
  switch(etwas)
  {
    case 5:
    {
      printf("It's 5.\n");
    }
    case 6:
    {
      printf("It's 6.\n");
    }
    default:
    {
      printf("It's something else\n");
      break;
    }
  }
  return 0;
}
EOD

rm -f 1
clang --version
echo === demonstrating that unrecognized warning names are not allowed ===
clang -Wnonsense-warning -Werror -Wall 1.c -o 1
echo === The real compile follows. ===
clang -Wimplicit-fallthrough 1.c -o 1
echo === The execution follows. ===
./1

输出:

FreeBSD clang version 4.0.0 (tags/RELEASE_400/final 297347) (based on LLVM 4.0.0)
Target: x86_64-unknown-freebsd11.1
Thread model: posix
InstalledDir: /usr/bin
=== demonstrating that unrecognized warning names are not allowed ===
error: unknown warning option '-Wnonsense-warning'
      [-Werror,-Wunknown-warning-option]
=== The real compile follows. ===
=== The execution follows. ===
It's 5.
It's 6.
It's something else
4

1 回答 1

2

显然,这是一个有意的设计决策,-Wimplicit-fallthrough应该只在 C++11 模式(而不是 C 模式或 C++03)中生效。

邮件列表讨论中表达的基本原理似乎是这样的:

  1. 他们不希望在 C 中默认启用它,因为它会惹恼 C 编码人员,并且(在 C2x 之前)没有商定的方式来指示代码中的故意失败;
  2. 他们确实希望在-Wextra指定时在 C++11 中启用它,所以他们想要-Wextra暗示-Wimplicit-fallthrough. 但是它们的前端不支持-Wextra根据我们是否处于 C++11 模式来暗示不同的选项;
  3. 实现 (1) 和 (2) 的最简单方法就是在 C 中完全禁用它
于 2018-02-25T21:15:19.307 回答