Linux2.6コア--コーディングスタイル(3)


9.typedef
カーネル開発者たちはtypedef文の使用に強く反対している.彼らの理由は次のとおりです.
1>typedefはデータの真のタイプを隠している
2>データ型が非表示になっているため、スタックに値を渡すように構造をプッシュするなど、エラーが発生しやすい
4>typedefを使用するのは、サボりたいためです.たとえば、このような形式を定義する場合があります.
  typedef unsigned char uchar
いずれにしてもtypedefはできるだけ使わないでください.
もちろん、typedefは、変数とアーキテクチャに関連する実装の詳細を隠す必要がある場合、あるタイプが将来変化する可能性があり、既存のプログラムが前方互換性の問題を考慮しなければならない場合、typedefが必要です.
    10.既製品を多用する
ドアを閉めて車を作らないでください.カーネル自体は文字列操作関数、圧縮関数、チェーンテーブルインタフェースを提供しているので、直接使用すればいいので、自分で創造しないでください.結局、自分で定義したインタフェースは既製のものよりずっと悪いことを知っておく必要があります.
    11.ソースコードでifdefの使用を減らす
ソースコードにifdefプリプロセッシング命令を使用することには賛成しません.自分の関数で次のような実装方法を使用するべきではありません.
#ifdef CONFIG_FOO
	foo();
#endif

逆に、取るべき方法はCONFIG_FOOが定義されていない場合はfoo関数を空にします.
#ifdef CONFIG_FOO
static int foo(void)
{
	/**/
}
#else
static inline int foo(void) {}
#endif  /*CONFIG_FOO*/
   
これで、あなたはどんな場合でもfoo()を呼び出すことができます.
    12.構造の初期化
構造を初期化するときは、そのメンバーの前に構造識別子を付ける必要があります.この初期化は、他の構造を誤って使用して初期化エラーを引き起こすことを回避することができる.無視値の使用をサポートします.カーネルコードは、次のように新しいC 99識別子フォーマットを使用する必要があります.
struct foo my_foo = {
	.a = INTIAL_A,
	.b = INTIAL_B,
};
   
ここで、aとbはいずれも構造体fooのメンバーであり、INTIAL_AとINTIAL_Bはそれらに対応する初期値である.フィールドに初期値が指定されていない場合は、ANSI Cで指定されたデフォルト値に設定されます(ポインタはNULL、整形は0、浮動小数点数は0.0に設定されます).例えば、foo構造体にint型のcメンバーがある場合、上記の初期化文が実行するとcは0に設定.