CおよびC + +プログラミングリソース

共有/ブックマーク
カスタム検索

Linuxカーネルのコーディングスタイル

2008年に掲示される10月15日

これは、短い文書のLinuxカーネルに適したコーディングスタイルを記述しています。 コーディングスタイルは非常に個人的なもの、私は誰に私の意見を_force_されませんが、これは何のために私が維持できるようにして行くと、と私はほとんど他のものもそれを希望さ。 少なくとも点を考慮してくださいここにした。

まず、私は、しないGNUのコピーをコーディング標準プリントアウトをお勧めしたい、それを読んでください。 Burnは、それらを、それは偉大な象徴だ。 とにかく、ここに行く:

インデントコードの

タブは8文字であり、このようにインデントも8文字です。 またインデント4(あるいは2を作る!)文字深いと、それは似てPIの値を定義する3になろうとしている異端者の動きがあります。

理由は:インデント後ろの全考え明確に定義することですここで制御開始と終了のブロック。 特に、20時間連続の画面を見てしたら、それは多くの場合は大規模なインデントをしている場合どのようにインデントが作品を見て簡単に見つける。

今、いくつかの人々が持つ8文字のインデントも右端にコード移動を行うと、主張するのは難しい80文字端末画面上で読みやすくなります。 への答えは、あなたがインデントの3つのレベル以上の必要がある場合には、とにかくねじしているであり、プログラムを修正する必要があります。

一言で言えば、8文字インデント物事は読みやすく、確認するときには入れ子の関数が深すぎるしていることを警告するという利点があります。 その警告に従ってください。

配置ブレース

常にCのスタイルで起動、他の問題は、中かっこの配置です。 インデントのサイズとは異なり、いくつかの技術的な理由は、他の上一配置戦略を選択するが、好ましい方法は、私たちにカーニハンはとリッチー開口を最後の行に括弧にすることです預言者で示すように、に開閉もあるなり置くブレース、最初マンドリーバ:

  x is true ) { (() xが真の
私たちは、y 
  

しかし、1つの特殊なケース、すなわち機能:彼らは開口部を次の行の先頭に括弧ので、しています:

 int x ) { body of function } int型関数(int 体の機能)×) 

世界中の異端の人々は、この矛盾は...うーん...矛盾が、主張しているすべての右の考え方の人々は_right_および(b)のK&Rです右は、()のK&Rを知っている。 また、関数は特別なとにかく(C言語ですることはできません入れ子に)です。

は閉じ括弧の注意空その独自の行には、それは同じステートメントの継続が続いている場合には、"中に、すなわち"を行うステートメントまたは_除く_"if文その他の"で、このような:

   
か体-ループ
 ( condition ) ;   条件); 

 x == y ) { .. } else if ( x & gt ; y ) { ... } else { .... } Rationale : K & amp ; R.  もし x == yは )(.. する )else if(x グアテマラ、y)は(...)  (....)根拠K&アンプ; rを 

また、注意してこのブレース-配置では、可読性を損なうことなく(またはほぼ空の)行を、空の数を最小限に抑えます。 したがって、画面上の新線の電源として再生可能な資源(25行の端末は、ここで画面思う)ではなく、より多くの空行をオンのコメントを入れて。

命名規則

Cはスパルタの言語なので、あなたの名前は、する必要があります。 とは異なりModula - 2のとPascalのプログラマは、CプログラマはThisVariableIsATemporaryCounterのようなかわいい名前を使用しないでください。 C言語プログラマは、どのくらい書くことが簡単であり、はなく、少なくともより理解することは困難、その変数"tmpを"と呼ぶだろう。

しかしは、大文字と小文字の名前は、グローバル変数のためのわかりやすい名前を嫌な顔をしている間必要がありますです。 グローバル関数"foo"を呼び出すには撮影行為です。

グローバル変数は、(あなたが意味がよく分かる)が必要な場合のみわかりやすい名前を持っている必要があるとして、世界的な機能を実行に使用される。 あなたはアクティブユーザーの数をカウントする機能を持っている場合は、"そのcount_active_users()が"または同様の場合は、_ない_"cntusr()"、それを呼び出す必要があります呼び出す必要があります。

名(いわゆるハンガリー表記)に関数の型をエンコードする脳損傷している - コンパイラはとにかく、型を知っている人を確認することができ、それが唯一のプログラマを混乱させる。 不思議マイクロソフトでは、バグのプログラムを行います。

ローカル変数名は短く、ポイントにする必要があります。 いくつかのランダムな整数のループカウンタをしている場合、それはおそらく呼び出す必要があります"i"が。 それを"loop_counter"を呼び出すと、非生産的な存在する場合、そのチャンスがない誤って理解されてです。 同様に、"tmpは"一時的な値を保持するために使用される変数の任意のタイプだけすることができます。 あなたのローカル変数の名前を混ぜを恐れている場合は、関数成長ホルモン不均衡症候群と呼ばれる別の問題を有する。 を参照して次の章。

関数

関数は短く、甘く、されるべき1つだけのことを行う。 彼らは1つまたは2つのテキスト画面分は、機構(ISO / ANSI画面サイズに収まる必要があります80 × 24、我々はすべて知っている)、および1つの事を行うには、そのよくありません。

関数の最大長は逆に複雑さと、その関数のインデントレベルに比例します。 だから、あなたがしている場合
1つだけ(長いが、単純な)の場合文、ここでは、多数の小さなものをたくさんしなければならないです概念的に単純な関数
異なる場合は、[OK]を長く機能を持っている。

ただし、複雑な関数がある場合、あなたは疑うことよりも低い天才1年高校の生徒かもしれないもない
どのような関数は、すべてについてであることを理解すると、最大値は、すべてのより密接に制限に従う必要があります。 あなたには、パフォーマンスクリティカルなことだと思う場合はわかりやすい名前(with Useのヘルパー関数を使用するにはに- lineにするようにコンパイラを求めることができる、それがprobablyにofより良い仕事をあなたがことができただろうかされます)。

関数のもう一つの措置は、ローカル変数の数です。 彼らは5〜10超えてはならない、または何かを間違ってやっている。 日時は思う
関数とし、より小さな部分に分割。 人間の脳は一般的に簡単に約7種類の異なるものを、何よりトラックを保つことができるそれが混乱してしまいます。 あなたは素晴らしいだが、知っているかもしれませんが何を2週間、今からか理解したいと思います。

注釈

コメントは良いですが、ものover -コメントの危険があります。 絶対にどのようにコードを説明しようとするコメントで動作する:それの多くエッターので_working_は明らかですがコードを書くこと、それは時間の無駄ひどく書かれたコードを説明するためだ。

一般的に、あなたのコメントはあなたのコードはではなく、方法お伝えしたいと思います。 また、関数本体内部のコメントを入れて回避しようとすると:この関数はそうすることとは別にその部分をコメントする必要がある複雑な場合は、おそらく第4章にしばらく行く必要があります。 あなたが小さいのコメントは注意してください何か、特に(賢いか醜いについて警告)することができますが、過剰なようにしてください。 代わりに、関数の先頭に、人々を伝えるコメントを入れ何か、おそらくそれはなぜか
それは。

あなたはそれを台無しに作った

それは[OK]を、我々はすべてのです。 あなたはおそらく"はGNU"が自動的にフォーマットにするためのCソースをEmacsに長い時間Unixユーザヘルパーによって言われている
あなたは、あなたがそのはい、それはそういませんが、気づいたdefaults、それが望ましいthan安くなっています(実際に使用して、彼らは、ランダムに入力よりも悪化している - 猿もGNU emacsに入力して、無限の良いプログラムを作ることだろう)。

だから、あなたはどちらのGNU Emacsの、取り除くことができますか、正気の値を使用するように変更します。 後者を行うには、あなたは次のようにスティックことができます。emacsファイル:

 c - mode ( ) "C mode with adjusted defaults for use with the Linux kernel." ( interactive ) ( c - mode ) ( c - set - style "K&R" ) ( setq c - basic - offset 8 ) ) (defunをにlinux - c -モード()"Linuxカーネル使用するためのデフォルト調整Cモードで"( インタラクティブ)(ウ - モード )(ウ - 設定 - スタイル " K&R")(setq  ℃ - 基本 - オフセット 8)) 

このは、Mxのlinux -のc - modeコマンドを定義します。 場合は最初の2行の文字列を-*-のlinux - cを-*-どこに置けばモジュールに、ハッキングは、このモードが自動的に起動されます。 また、追加することができます

(setqを自動モード連想(短所'("は/ usr / src / linuxには.*/.* \は[チャンネル"$入力]のlinux - cをモード)
自動モード連想))

あなたは、linux - cをモードを持っている場合に。emacsにファイルが自動的にするときは、/ usr / src / linuxの下でソースファイルを編集するに切り替えました。

しかし、たとえあなたがemacsは正気の書式設定を行うには取得に失敗ではなく、すべてが失われます:使用"インデント"。

今、再び、GNU indentは、同じ脳死状態に設定をしては、GNU emacsのは、なぜあなたはそれにいくつかのコマンドラインオプションを与える必要がありますしています。 あなただけのインデント"- krをオプションを与えるので、- i8をGNU indentのもメーカーは、GNUの人々は悪されていませんK&Rの権限を(認識するためしかし、それはあまりにも悪い、ではなく、彼らは深刻なこの問題では見当違い)が、 "は(K&Rの"は、")8文字のインデントを立っている。

"インデント"、および多くのオプションを持って、特にそれが再インストールした後は、マニュアルページをご覧になる場合があります書式コメントをしています。 しかし、覚えている:"インデントを"悪いプログラミングのための修正プログラムではありません。

コンフィグレーションファイル

構成オプション(アーチ/ xxxは/ config.in、すべてのConfig.inファイル)については、多少異なるインデントが使用されます。

設定オプションで、テキストの依存関係を示すために2インデントレベルが必要ですが3のインデントレベルは、コードで使用されます。 後者は/トライステートオプションをboolに適用されます。 他のオプションについては、ちょうどusecommon感。 例:

 "$CONFIG_EXPERIMENTAL" = "y" ] ; then tristate 'Apply nitroglycerine inside the keyboard (DANGEROUS)' CONFIG_BOOM if [ "$CONFIG_BOOM" ! = "n" ] ; then bool ' Output nice messages when you explode' CONFIG_CHEER fi fi "の 場合 ["CONFIG_BOOM $;しトライステート'適用ニトログリセリン内部キーボード(危険] CONFIG_EXPERIMENTAL"="y"を)'CONFIG_BOOM場合、["$!= "n"]; してブール' 出力素敵なメッセージをするときには爆発CONFIG_CHEER FiのFiの 

一般的に、CONFIG_EXPERIMENTALすべてのオプションを安定していない囲む必要があります。 データ(ファイルシステムの実験的な書き込みのサポートをゴミ箱に知られているすべてのオプションは、例えば)(危険)、他の実験のオプションは(実験的)表記する必要がありますように表記する必要があります。

データ構造

可視性は作成され、常に参照カウントが必要に破壊シングルスレッド環境外でいるデータ構造。 カーネルでは、ガベージコレクションが(存在しないとカーネルのガベージコレクションの外ゆっくりと効率的)、これを使えば必ず参照カウントすべてyour uses _have_ことを意味します。

参照カウントは、あなたがロックを回避することができます、ということand複数のユーザーが並行して、データ構造へのアクセスを持っている - と構造ではないhavingto worry突然すぐにそれ下では、or寝ただけので、FROM goingことができますが何か他のでした。

そのロックに注意し、参照カウントの代替品を_ない_です。 参照カウントは、メモリ管理の手法ですがロックは、データ構造の一貫性を保つために使用されます。 通常の両方が必要であり、それらはお互いに混同しないようにします。

多くのデータ構造が実際に参照カウントの2つのレベルを、別の"クラスのユーザーは"ですができます。 サブクラスの数は、サブクラスのユーザー数をカウントし、デクリメントグローバルカウントを1回だけがサブクラスのカウントがゼロになる。

マルチ参照カウント"この種の例は、"メモリ管理の(""mm_struct構造体:mm_usersとmm_count)、および見つけることができます
ファイルシステムのコードは、(""ATTR_SIZEが渡された構造体:s_countとs_active)。 注意:別のスレッドがデータ構造を見つけることができる場合、あなたはそれに参照カウントを持っていない場合は、ほぼ確実にバグがあります。

タグ:

同様にあなたが参照してください何ですか?

購読して1つの常連になる! あなたは、私たちはこのようにさらにお得な記事を追加するかを最初になります。 参加までのいずれかでRSSフィード電子メールの更新は本日!

この記事に1つのコメントがあります。 あなたはを通してこのエントリへの応答に続くことができるのRSS 2.0フィード。あなたは最後まですることができますスキップして、応答を残しまたはトラックバックをサイトから自分の。


返信コメントを残す

あなたがする必要がありますログインコメントを投稿します。