C言語の拡張

Linuxカーネルgcc拡張を多用しているが,Ken Thompson氏が書いたPlan9コンパイラ(通称Ken C?)も,ANSI Cから拡張がなされている.それらは基本的にC99なんだけど,(C99前に実装されたってのもあるんだろうけど)微妙に文法が違っているので,注意が必要である.

例えば,こんな風に変数を列挙して構造体に代入できたり,

rio/wind.c
  305:                                 m = (Mousestate){w->mc.Mouse, w->mouse.counter};

これはC99では,複合リテラル(Compound Literal)と呼ばれるようだ.

次はマウスのメニュで使われる文字列を定義している部分だけど,配列の要素の前に[...]という表記があるが,これは配列のインデックスの指定に使われる.

rio/rio.c
   58: enum
   59: {
   60:         Cut,
   61:         Paste,
   62:         Snarf,
   63:         Plumb,
   64:         Send,
   65:         Scroll,
   66: };
   67: 
   68: char            *menu2str[] = {
   69:  [Cut]          "cut",
   70:  [Paste]                "paste",
   71:  [Snarf]                "snarf",
   72:  [Plumb]                "plumb",
   73:  [Send]         "send",
   74:  [Scroll]               "scroll",
   75:                         nil
   76: };

指示付きの初期化子(Designated Initializer)というもので,C99で追加されているが,微妙に文法が違う.C99の場合は[Cut] = "cut"のように等号が必要である.疎な配列を初期化するために使われるが,enumでインデックスを定義することでコメントのように見えなくもない.これは例が悪いが.

構造体に対する指示付きの初期化子も同様である.ただし配列の場合はよく見かけるが,構造体はまだ見てない気がするな.Linuxカーネルではよく使われているけど.