2

不注意な「switch」ステートメントのフォールスルーをclangにキャッチしてもらいたいです。このシェル スクリプトは、私の失敗を示しています。スクリプト自体の後に出力を示します。私は何を間違っていますか?

#!/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 に答える