2012年2月24日金曜日

C言語のswitch文で ...

Linux のコードを見ていると、こんな書き方もできるのかぁ、というものに出くわすことがありますね。

例えば、
arch/arm/mach-rpc/irq.c  にある、以下のようなコード。

                switch (irq) {
                case 0 ... 7:
                        irq_set_chip_and_handler(irq, &iomd_a_chip,
                                                 handle_level_irq);
                        set_irq_flags(irq, flags);
                        break;

                case 8 ... 15:
                        irq_set_chip_and_handler(irq, &iomd_b_chip,
                                                 handle_level_irq);
                        set_irq_flags(irq, flags);
                        break;

                case 16 ... 21:
                        irq_set_chip_and_handler(irq, &iomd_dma_chip,
                                                 handle_level_irq);
                        set_irq_flags(irq, flags);
                        break;

                case 64 ... 71:
                        irq_set_chip(irq, &iomd_fiq_chip);
                        set_irq_flags(irq, IRQF_VALID);
                        break;
                }



...」で範囲指定できるらしい。見た時びっくりしました。

 
gcc のマニュアルを参照すると
http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions

これはGNU 拡張機能らしいです。
(Case Ranges: `case 1 ... 9' and such. )

gcc に -pedantic をつけると非標準機能を使っていると警告してくれるみたい。
ポータビリティを気にする場合は便利かも。

上のような書き方をすると

警告: range expressions in switch statements are non-standard

という風に warning 出してくれました。

0 件のコメント:

コメントを投稿