Show page source of CodingRule #40466

= コーディングルール

 * 確定次第、固定的なHTMLとしてプロジェクトホームに記載。
 * 新規の修正においては必ずこのルールに従う。
 * 古いコードも順次、修正する。

== マクロ

=== 新たな定数マクロは導入しない。

必要な場合は、constで型を明示する。

=== 関数マクロの使用禁止

必要な場合は、関数化する。以下の様なマクロは使用禁止。

{{{ code c
#define ADD(x,y) ((x)+(y))
}}}

=== configureの結果によるコンパイル制御用のマクロは定義可能

ただし、事前に相談する。

=== 他のライブラリで定義されたマクロは、その使用目的に合致する場合のみ使用可能

(例)stdlib.hで定義されるEXIT_SUCCESSが0である事を期待して他の用途に使ってはならない。

== 変数

 1. 変数名を極端に短く省略したり意味のない変数名は禁止
 1. 変数には型に応じた適切な prefix をつける。
 1. 変数宣言部分には、用途などのコメントを入れる。
 1. グローバル変数は原則として使用禁止

=== prefix(例)

||short型||s||
||unsigned short型||us||
||int型||i||
||unsigned int型||ui||
||long型||l||
||unsigned long型||ul||
||char型||sz||
||char *型||psz||
||bool型||b||

== 記法

 1. インデントはスペースではなくタブを用いる。
 1. C++のコメント(//)は禁止。
 1. 中括弧{}の対応を一目で分かるように記述。
 1. {}の省略禁止。
 1. { の後は、インデントを必ず増やす。} でインデントを必ず減らす。
 1. 変数宣言部の後には、必ず1行以上、空行を入れる。

{{{ code c
	int main(int argc, char *argv[])
	{
		int iCounter; /* ループカウンタ */

		for(iCounter=0; iCounter<10; iCounter++)
		{
			...
		}

		return 0;
	}
}}}

== その他

=== 処理が長くなった場合は、関数分割を検討すること。
原則として、1ページに収まらない関数は分割する。

=== 3項演算子
使用を禁止とする。

=== コンパイルスイッチ
 1. #if 0 や #if 1 は使用禁止。
 1. やむを得ずコンパイルスイッチを用いる場合は、意味のある定義名で #ifdef なり #ifndef すること。

=== boolian 型以外の判定
明確に2値で定義された型以外で、if ( hoge ) とか if ( !hoge ) のような判定を用いることは禁止。

=== return文
 1. 1関数につき1箇所であることが望ましい。
 1. インデントが深くなる場合は、この限りにあらず。

=== goto文
言うまでもないことだが、使用は厳禁

== 余談

このようにルールを決めても必ず破る人がいます。

そういう人に限って、バグを出したりします。(オマエモナー)

=== 推奨するindentのオプション

indentを使う場合は、コンパイルエラーがでない状態でお願いします。また、typedefなどがある場合は、-Tオプションでindentに教えてやる必要があります。詳細は、indentのmanページを確認願います。

{{{ code sh
indent -bad -bap -bl -bli0 -lp -npsl -i8 -ss filename.c
}}}

||-bad||宣言ブロック全ての後に必ず空行を置く。||
||-bap||それぞれの宣言本体の後に必ず空行が置かれる。(関数間の空行)||
||-bl||対応する{}を同じカラムにする。||
||-bli0||{}を余分にインデントしない。||
||-lp||複数行にまたがる文を見やすくする。||
||-npsl||手続きの型を名前と同じ行に置く。(ctagsなどを使う場合は、-pslの方が良い。)||
||-i8||インデントをタブにする。(空白8文字分)||
||-ss||一行で記述した `for' 文と `while' 文において、セミコロンの前に空白を置く。||

ちなみに良く使うオプションは、~/.indent.proというファイルに記述しておくと良い。

 -bad -bap -bl -bli0 -lp -npsl -i8 -ss