50

のコードは次の/usr/src/linux-3.10.10-1-ARCH/include/linux/printk.hとおりです。

static inline int printk_get_level(const char *buffer)
{
  if (buffer[0] == KERN_SOH_ASCII && buffer[1]) {
    switch (buffer[1]) {
    case '0' ... '7':
    case 'd':  /* KERN_DEFAULT */
      return buffer[1];
    }
  }
}

オペレーターの一種でしょうか?「The C Programming Language」がそれについて言及していないのはなぜですか?

4

4 に答える 4

65

これはgcc case range と呼ばれる拡張機能です。ドキュメントでは次のように説明されています。

次のように、1 つのケース ラベルで連続する値の範囲を指定できます。

case low ... high:

gcc 拡張機能の完全なリストは、こちら にあります。との互換性を維持するために、clang もこれをサポートしているようgccです。または のいずれかで-pedanticフラグを使用すると、これが非標準であることを警告します。次に例を示します。gccclang

warning: range expressions in switch statements are non-standard [-Wpedantic]

Linux カーネルが多くの gcc 拡張機能を使用していることに注意するのは興味深いことですが、記事で取り上げていない拡張機能の 1 つはステートメント式です。

于 2013-09-17T15:12:13.163 に答える
10

標準 C ではないため、移植性がないことに注意してください。これは、case ステートメント用に考案された略記です。Cでは整数型のみをオンにできるため、明確に定義されています。

標準 C では、...可変長引数リストでのみ使用されます。

于 2013-09-17T15:12:39.330 に答える