http://cgit.freedesktop.org/systemd/systemd/tree/CODING_STYLE の抄訳。正確な情報を得たい場合は、原文を参照のこと。
- 8スペースのインデント、タブは使うな
- 1行80文字制限はしない。長すぎるのは良くないが、140文字以内で十分だろう
- 変数や関数は必要がなければstaticでなければならない
- 構造体の名前はMixedCase (公開APIは例外)、変数や関数はlower_case
- The destructors always unregister the object from the next bigger
object, not the other way around- next bigger objectというのが不明だが、
おそらく、[data collection]->(parent object)->(child objects)という
関係があったときに、parent objectを解放するなら、まず[data collection]
からparent objectを取り出してから、解放処理を行なえという意味だと思われる
- next bigger objectというのが不明だが、
- キャストでなくユニオンを使おう
- デストラクタは中途半端に初期化されたオブジェクト群も後始末できるようにすべきだ
- エラーコードは負のerrnoにすること
- stdout/stderrに正しく書けたかどうかエラーチェックはしなくて良い
- ライブラリのコードからエラーログを出力するな (DEBUGログはOK)
- OOMは常にチェックしろ。例外はない
- PID=1のプロセスからNSSリクエストはするな。デッドロックを起こすかもしれない
- PID=1のプロセスから、他のサービスに同期通信するな。デッドロックを起こすかもしれない
- 最大値が決まっててそれが小さいのでなければ、固定サイズの文字列バッファを使うな
- Stay uniform. For example, always use "usec_t" for time
values. Do not usec mix msec, and usec and whatnot.- (いまいちよく分かっていない) 一貫性を保て。例えば、時間を表わす値には常にusec_tを使って、usecとmsecを混ぜないとか
- _cleanup_free_系のマクロを使え
- 浮動小数点数を文字列化したりパースするときは特別に注意しろ。locale依存だから
- 強制はしないが、関数定義は:
void foo()
{
}
ではなく
void foo() {
}
を使おう - foo ()と書くな、foo()と書け
- 文字列一致判定にはstrcmp()の代わりにstreq()を使ってくれ
- コードの途中で変数定義をしないでくれ。(関数途中の{}の始めなら良いのかな?)
- 配列を作るのでもなければ、floatじゃなくてdoubleを使うのが常に良い
- 変数定義行で関数を呼ぶな
- クリーンナップ処理にはgotoを使え。そして、それ以外のことにgotoを使うな
- 変数の型についてよく考えろ。もし負の数にならないならばsigned intでなくunsigned intを使え
- shortを使うな
- 公開APIは_public_マクロとマークされて、sd_プリフィックスを付けなければならない
- 公開APIでは、必ず引数をチェックしてassert_returnでエラーコードを返さなければならない
- strtolやatoiといった関数は決して使ってはならない。代わりにsafe_atoliやsafe_atou32を使え
- 関数を書く時は、それがログを取る関数かそうでないかをよく考えるべきだ
- いくつかの例外を覗いて、staticローカル変数は避けるべきだ。スレッドセーフのことを考えろ!
- オプション解析に関して
- エラー時に、完全なhelpメッセージを出力するな。そのエラーに関することだけ出力しろ
- エラー時にはstdoutに出力するな
- 必要でないならPOSIX_ME_HARDER (POSIXLY_CORRECT)にするな。例えば、+プリフィックスとか