annoymouse cowardのコメント: C89からC11への変更点 (スコア 4, 参考になる) 76
C89からC11だと間に C99があります.
C99で標準化された機能でカーネルコードに影響がありそうなものは
- 可変引数マクロ. __VA_ARGS__ 使うやつ
- designated の初期化. struct A { int hoge; int fuga}; A a = { .hoge = 1, .fuga= 2}; って書けるやつ
- 可変長配列
- サイズゼロ配列
- for (int x=0; x<10; ++x) って感じでローカル変数が宣言できるやつ
などがあります.
最後の for文内でローカル変数が宣言できる機能が,今回のC89からC11に移行するきっかけになった新機能です.
LKMLの議論だと,全部のメールを読んだわけではありませんが流し読みした感じでは
C89からC99に移行しようと言う話になって,どうせならC11にしたら?って流れになってました.
ただし上記のC99機能は以前からgccなどたいていのコンパイラでは実装済みになっていて(確か GCC 5.0あたりで実装された)
例えば,サイズゼロ配列や designated 初期子は既存のlinuxカーネルでも多様利用されています.
ですから厳密にはC89だけではlinuxカーネルはコンパイルできません.
次にC11で標準化された機能でカーネルコードで役に立ちそうなのは
- _Generic キーワード.c++ でいうtemplate関数みたいなtype genericなマクロが書ける
- stdalign.h .アラインメントを指定する修飾子が使える
です.
特に _Genericキーワードはかなり強力で,よりセキュアで実行速度が速いコードが簡単に実装できるようになります.今後の展開が楽しみです.