アカウント名:
パスワード:
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キーワードはかなり強力で,よりセキュアで実行速度が速いコードが簡単に実装できるようになります.今後の展開が楽しみです.
まともに追いかけていない門外漢だけど、linuxってgcc固有機能もあちこちで使っている印象だったので今でも(建前上は)C89縛りだったんかい!という感じ
で、今回ついに-std=gnu89では使えないコア言語の機能(for文内でローカル変数を宣言できる機能)が問題になったと
なんか以前移行を試みたときはgcc 4.x系のバグを踏んで断念したらしい
組み込みに使えないコードとか吐き出してこないのかだけ心配
どういうののこと言ってんの?
ベンダが対応するだろ多分。i386見たくメインストリームからバッサリ切られるかもしれないけど。
C99からのジャンルの統合ありますのでご注意をえ?コミケじゃない?
GCC拡張のサイズゼロ配列は使ってるとこあるだろうけど、C99のは使ってるとこある?同機能別文法のものが使われてるって言いたいのかもしれんが。
C99からC11の変更点。・VLAがオプションになった。不思議。サポートしないコンパイラがあるようには思えないけど。
しかしなぜC18ではないのか。新しすぎか。
gccとc99でinlineの仕様が微妙に変わってなかったっけ?確かextern inlineとinlineの意味が入れ替わった。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
計算機科学者とは、壊れていないものを修理する人々のことである
C89からC11への変更点 (スコア:5, 参考になる)
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キーワードはかなり強力で,よりセキュアで実行速度が速いコードが簡単に実装できるようになります.今後の展開が楽しみです.
Re: (スコア:0)
まともに追いかけていない門外漢だけど、linuxってgcc固有機能もあちこちで使っている印象だったので
今でも(建前上は)C89縛りだったんかい!という感じ
Re:C89からC11への変更点 (スコア:1)
C99の新機能はライブラリの機能ばっかりでカーネルのコード書くときは関係ないよねというのがC89にとどまってた理由
Re: (スコア:0)
で、今回ついに-std=gnu89では使えないコア言語の機能(for文内でローカル変数を宣言できる機能)が問題になったと
Re: (スコア:0)
なんか以前移行を試みたときはgcc 4.x系のバグを踏んで断念したらしい
Re: (スコア:0)
組み込みに使えないコードとか吐き出してこないのかだけ心配
Re: (スコア:0)
どういうののこと言ってんの?
Re: (スコア:0)
ベンダが対応するだろ多分。i386見たくメインストリームからバッサリ切られるかもしれないけど。
Re: (スコア:0)
C99からのジャンルの統合ありますのでご注意を
え?コミケじゃない?
Re: (スコア:0)
GCC拡張のサイズゼロ配列は使ってるとこあるだろうけど、C99のは使ってるとこある?
同機能別文法のものが使われてるって言いたいのかもしれんが。
Re: (スコア:0)
C99からC11の変更点。
・VLAがオプションになった。
不思議。サポートしないコンパイラがあるようには思えないけど。
しかしなぜC18ではないのか。新しすぎか。
Re: (スコア:0)
gccとc99でinlineの仕様が微妙に変わってなかったっけ?
確かextern inlineとinlineの意味が入れ替わった。