株式会社アルウィン
C 言語コーディング規約
Alwin Corporation.
page1
1. はじめに
本コーディング規約は、(株)アルウィン社内で作成する C 言語ソースコードの可読性、メ ンテナンス性の向上、丌具合の混入を防ぎやすくするための記述方法及び、推奨する記述 方法を記述した文書である。2. 目的
本コーディング規約は、ソースコードの可読性、メンテナンス性の向上、丌具合の混入 を可能な限り防ぎ、品質の高いソースコードを作成する一助とすることを目的とする。3. 適用範囲
本コーディング規約は(株)アルウィン社内で作成する全ての C 言語ソースコードに適用 される。ただし、納入先のコーディング規約に従う場合や、プロジェクトで独自に規約を 定めている場合はその限りではない。Alwin Corporation.
page2
4. 命名規則
□共通 原則として単語を省略せずに、意味の分かる命名とすること。 Info、Data、Temp、Str、Buf 等の無意味な名前は再検討すること。 □関数 ・基本 先頭は原則として動詞とし、動詞部分を全て小文字、以降の単語は区切り文字を大文 字とすること。 【例】 ArrayList* getArrayList(void) ・動詞の対称性 関数名に付ける動詞は、以下の英語の対称性に気を付けること。 add/remove insert/delete get/set get/release put/get start/stop begin/end send/receive first/last up/down show/hide source/target source/destination open/close increment/decrement lock/unlock old/new next/previous・真偽を返す関数
is+形容詞、can+動詞、has+過去分詞、三単元動詞、三単元動詞+名詞とすること。 【例】
int isEmpty(void) int canGet(void) int hasChanged(void) int constains(void) int constainsKey(void)
・仮引数の意味の対称性
対称性のある仮引数は、対称性のある名称とすること。 【例】
Alwin Corporation.
page3
□変数名 ・ローカル変数 全て小文字で記述し、単語の区切りはアンダースコア"_"を入れること。 【例】 local_value ・グローバル変数 先頭に"g_"を付けて、全て小文字で記述し、単語の区切りはアンダースコア"_"を入れ ること。 【例】 g_global_value ・定数 全て大文字で記述し、単語の区切りはアンダースコア"_"を入れること。 【例】const int CONST_VALUE = 300
・ループカウンタ 20 行程度で終わるループの場合、ループカウンタの名称を i,j,k など、意味の無い変数 名としても良い。 □列挙型 ・タグ 先頭に"tag"を付けて、単語の区切りは大文字とすること。 ・列挙定数 区切り文字を大文字で記述すること。 ・別名 区切り文字を大文字で記述すること。タグ名の"tag"を削除した残りと一致させること。 【例】 enum tagOrder { FIRST=0, SECOND, THIRD }Order;
Alwin Corporation.
page4
□構造体、共用体のタグ ・タグ 先頭に"tag"を付けて、単語の区切りは大文字とすること。 ・メンバ 区切り文字を大文字で記述すること。 ・別名 区切り文字を大文字で記述すること。タグ名の"tag"を削除した残りと一致させること。 【例】typedef struct tagStruct { int member1; int member2; }Struct; □ディレクティブ ディレクティブで使用する名称は、全て大文字で記述し、単語の区切りはアンダースコ ア"_"を入れること。 【例】 #define CONST_VALUE (300) #if CONDITION_A #endif
Alwin Corporation.
page5
5. コメント
□コメントのスタイル doxygen で認識されるコメントのスタイルを推奨する。 □ファイルヘッダ ファイルヘッダは必ず付けること。 □関数ヘッダ 外部へ公開するヘッダファイルには必ず関数ヘッダを付けること。 □変数 宣言時に意味を記述すること。 □構造体、共用体のメンバ、列挙定数 定義時に意味を記述すること。 □無意味なコメントの禁止 無意味なコメントは記述しない。 【例】 a = b; // b を a に代入する □TODO コメント 短期的なその場しのぎの解決であったり、十分ではあるけど完璧でないコードは TODO コメントを記述すること。Alwin Corporation.
page6
6. ヘッダファイル
□インクルードガード ヘッダファイルには必ずインクルードガードを記述すること。 インクルードガードの終わりには、ガード時の名称のコメントを記述すること。 □インクルード 必要十分なインクルードをすること。7. プリプロセッサ命令
□基本 リテラルを置き換えるための#define、インクルードガード以外のプリプロセッサ命令は できる限り使用しないこと。 □処理の切り分け プリプロセッサ命令で関数内の処理を切り分ける場合、ブロックを跨がないこと。 【悪い例】 #if CONDITION_A { a = b; #else { a = c; #endif } □処理の置き換えの禁止 #define を使用して処理を記述しないこと。 □インデントの禁止 プリプロセッサ命令はインデントせずに、行のはじめから記述すること。Alwin Corporation.
page7
8. 関数
□プロトタイプ宣言 ファイル内でのみ使用する関数であっても必ずプロトタイプ宣言をすること。 □関数の分け方 複数の機能を持った関数を定義せず、1つの機能で1つの関数を作成すること。 □関数の行数 できる限り 100 行以内でおさめること。 □仮引数 仮引数の変更は行わないこと。 □戻り値 戻り値を括弧で括らないこと。 □ローカル変数の初期化 ポインタ変数は、必ず初期値と共に宣言すること。 その他の変数は、できる限り初期値と共に宣言すること。9. 再帰関数
□基本 できる限り再帰関数は使用しないこと。 □スタック 使用する場合、再帰関数内のローカル変数の宣言は極力少なくすること。 □終了 確実に再帰が終了するように設計すること。Alwin Corporation.
page8
10. 構造体
□定義 typedef 指定子を用いて別名を定義し、再利用しやすくすること。 □タグ名 タグ名を必ず付けること。 【例】typedef struct tagStruct { int member1; int member2; }Struct; Struct value;
11. 列挙型
□定義 typedef 指定子を用いて別名を定義し、再利用しやすくすること。 □タグ名 タグ名を必ず付けること。 【例】 enum tagOrder { FIRST=0, SECOND, THIRD }Order;Alwin Corporation.
page9
12. コーディングスタイル
□インデント スペースのみを使用すること。 毎回スペース2つずつインデントを入れること。 ブロック単位でインデントを入れること。 □長い行 一行の最大は 120 文字とし、超える場合は行を分割すること。 □const、static できる限り const を使用すること。 ファイル内のみで使用するグローバル変数には static を使用すること。 □制御文 ・括弧内の記述 括弧の内側にはスペースを入れないこと。 ・ブロック省略の禁止 ブロックを省略しないこと。 【悪い例】for(i = 0; i < MAX; ++i) a += i;
・ブロックの記述位置
制御文のキーワードと同じインデント位置にブロックを記述すること。 ブロック内はインデントを入れること。
【例】
for(i = 0; i < MAX; ++i) {
a += i; }
□for 文
Alwin Corporation.
page10
□switch 文 原則として case 節は break 文で終わらせること。 空の case 節を使用する際には、case 節の中にコメントを記述しないこと。 常に default ケースを持つようにすること。□while 文、do while 文
できる限り for 文を使用すること。
while 文、do while 文を使用しなければならない場合、確実にループ外に抜け出せるように すること。
□goto 文