- 締切済み
あなたのC言語コーディング規約
勤務先・学校・趣味でC言語を使用してプログラムをしている方の多くは組織内で決めているコーディング規約に沿ってプログラムをしていると思います。 しかし、全てに関して規約化されていることは少なく、ある程度プログラマの裁量に任せていることがあると思います。 そこで、質問です。 「あなたの中で決めているコーディング規約は何ですか?」 「また、その理由は何ですか?」 私が決めているコーディング規約を一例挙げると以下の通りです。 (基本は他人が見ても直ぐに理解できるように心がけてます。) ------ □変数名の前には必ず型を現す文字を書く 理由:観ただけで型が分かるから。 例 :int型は、iData char配列は、stData ポインタは、pData □関数の復帰値は、一旦必ず変数に代入する。 理由:代入しないとデバックがしにくい。 例 :iRetCode=func(); switch(iRetCode){ case文 } の、ように色んな値を試すときに不便。 □if文には、極力「!」(NOT)は使用しない。 理由:複数の論理和・積などが入った場合ややこしいので elseで代用する。(真の時の処理はわざと書かない) □if文の判定には必ず定数値を左辺に持ってくる。 理由:if(iData=0)とかの"=="を"="にしてしまうミスを防ぐため。 (コンパイラによっては、警告が出るものもありますが…) 例 :if(0=iData)など □while(1)は、基本的に使用しない。 理由:無限ループに陥らないようにするため。 ------
- みんなの回答 (19)
- 専門家の回答
みんなの回答
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
識別名は、理論的な名称を優先して、コンパイラの都合は優先しない (どうせ、本当に重要な変数は、class か、複合型なので、わざわざ、型を変数名に含めない) 条件判定は、「いいたいことを表すように」書く if (fin.eof()) ... eof() のための特殊処理 = eof の時の処理 while(! fin.eof()) ファイルの通常処理 = eof でないときの処理 関数の返値を余計な変数にストアしない result = fun(); if (result); この2行の間に、割り込みが起きて、result が壊されたら? それに、一時変数が増えると、いつしか、ほかでも使い回しにされる危険性多し。 無限ループは、while(1) 明示されている無限ループのほうが、明示されていない隠れ無限ループよりはるかにまし デバッグのしやすさという基準を、コーディング規則の基準にしない デバッグするためなら、#define debug etc. で、システム的に デバッグしやすくするために工夫したつもりで、バグを呼んでは困る ひとつのプロジェクトでは、動詞、名詞の順序を固定する printNewItem() と newItemGet() を 混在させない ひとつのプロジェクトで、動詞の対応をとる getList() と writeList() を混在させない 条件式で、定数は左側 定数が左にあると気持ち悪いから。 (== という特殊な例のために、その他の大部分で気持ち悪いのはいや) こんなところですかね。
- jacta
- ベストアンサー率26% (845/3158)
要点だけを挙げると... 1. 可能な限り規格厳密合致プログラムにする。 2. 規格厳密合致が無理な場合、処理系に対する仮定を明確にする。 3. 処理系に依存する部分を分離する。 これに加えて、C++では、 4. 例外安全にする。 5. 可能な限り静的にエラー検出を行う。 といった感じです。 細かな部分はいろいろありますが、それほど本質的ではありません。
- yasuch
- ベストアンサー率41% (27/65)
最近は コーディング作法ガイド というキーワードで ググって最初に見つかるやつを使ってます。
- tatsu99
- ベストアンサー率52% (391/751)
私なりの見解です。 >□変数名の前には必ず型を現す文字を書く 特にこだわりません。但し、広域変数はext_を頭につけてます。それ以外は、その関数のなかで、変数を定義するので、その定義をみれば、わかります。 >□関数の復帰値は、一旦必ず変数に代入する。 同感です。私もこの方法を採用しています。 >□if文には、極力「!」(NOT)は使用しない。 特にこだわりませんが、if文はステップが減るか、判りやすいか、の何れかを優先します。 >□if文の判定には必ず定数値を左辺に持ってくる。 その通りですが、人間の思考パターンになじまないので、採用していません。その為、if (a=1)などのコードをかいて、バグを誘発しています。但し、コードが完了した後で、if (a=1) や a == b;などの文法上はOKだが、処理内容上はNGのコードをチェックするツールを作り、この呪縛から、逃れています。 >□while(1)は、基本的に使用しない。 使っています。breakをきちんといれれば、問題ありません。 そのほかは、 1.処理速度向上と、プログラムのシンプル化のため関数間のデータをパラメータ渡しにしないようにしています。但し、ニューメリックチェックルーチンのように業務と無関係な共通関数は、パラメータ渡しにしています。 2.同じ処理はマクロでまとめています。 例えば、 if (strcmp(x,"abc")==0){ printf("abc"); return 1; } if (strcmp(x,"xyz")==0){ printf("xyz"); return 1; } のように、strcmpの右辺のみが、異なるようなコードを 何行も書くときに、 if (strcmp(x,"xyz")==0){ printf("xyz"); return 1; } の部分をマクロで1行にまとめて、ステップをへらします。 3.64ビットモードでのコーディングと32ビットモードでのコーディングが両方発生するので、どちらでも使えるようなコードをかくようにしています。 (例えば、ポインターのサイズを4バイトに限定しない。時間の取得は、int型で取得しない。long型を使用しない等)
- hitomura
- ベストアンサー率48% (325/664)
>「あなたの中で決めているコーディング規約は何ですか?」 私のコーディング規約はありません。 なぜなら、「個人(あなた/私/etc.)」の「コーディング規約」というものは存在しないためです。 コーディング規約はプロジェクト単位で制定されるものです。 これは、各人のコーディングの癖が混在し、ソースファイルが読みにくくなることをふせぐためであり、あなたが提示された「規約」と#2の方の意見との間でどちらが優れているかという神学論争を防ぐためでもあります。 したがって、私のコーディングの癖はありますが、私のコーディング規約はありません。 その「癖」でよければ、以下に記述します。 ------ □ポインタ型変数名の前にはpまたはp_を書く 理由:ポインタは取り扱いに注意が必要なため □関数の復帰値は、変数に代入するかは特に決めていない。 □if文には、極力「!」(NOT)は使用しない。 付則:複雑な判定になる場合はその判定を関数化する □if文の判定には定数値を右辺に持ってくる。 付則:ただし、片方が関数で、その関数名が長い場合は定数値を左辺に持ってくる 例 :if(0==AllYourBaseAreBelongToUsAllYourBaseAreBelongToUsAllYourBaseAreBelongToUs())など □while(1)ではなくfor(;;)を使う
- MrBan
- ベストアンサー率53% (331/615)
「C言語」ですか? であればISO/IEC9899準拠、もしもC++ならISO/IEC14882準拠。 CではなくC++を選ぶ。 理由:Cよりは、便利で安全で使いやすいから。 複数のコンパイラにかけて、警告が出ないようにする。 理由:標準準拠/マルチプラットフォーム前提なら当然のことだと思う。 各言語仕様書のサンプルのような命名規約で書く。 (ラクダ表記/ハンガリアンなどは使わない/大文字は定数くらいしか出てこない) 理由:好み。C/C++に大文字が混じるのは美しくない(Java等のときは混じってかいてますが) 上記からも当然に、型名などを変数名にはつけない。 理由:意味的におかしいと思う/型変更に弱い/IDEで間単に参照できる/ (C++の場合は更に)ユーザ定義に対応できない/必要性が薄い コンパイラがチェックできるもののために可読性を落とさない。等式を逆順になどしない。 理由:昔の知恵なのだとは思うが、自分では可読性が落ちるだけだと思う。 無限ループならwhile(1)ではなく、for(;;)を使う。 理由:警告レベルを上げたときに、定数式のループを警告されたことがあるから。 (C++なら)マクロでは無く定数を使う。 理由:型安全だから。 むやみにキャストしない。 理由:設計のしわ寄せが多いから。設計を見直すなり、templateを活用するなりを考える。 などなど。全部はとても書けませんが。
- riverman2005
- ベストアンサー率100% (2/2)
はじめまして。 C++にて開発を行っているものです。 自分の勤めている組織内ではやはり規約化はされていません。 各、PGが独自の規約(?)を作ってやっていますね。 自分は、大体下記のような感じでコーディングをしています。 ■変数名 頭に変数の型をつける。 int iData; char szBuff[16]; char *pIn; struct stuData strDataRec; などなど。 ■関数名 fnSubMain() 頭にfnをつけ、関数である事を明示しています。 また、クラスの使用時は、Onxxxxという形で 宣言しています。 ■ループ ループに関しては、時と場合によりです。 配列の添え字として使用する場合は、forループ 主体、テーブル内のデータ検索などは、while(1) で無限ループを使用し、データ終端でループエンド という形です。 ■if文の判定には必ず定数値を左辺に持ってくる 同じく、=防止の為、極力同じようにコーディング しています。 ■その他 #defineの羅列がきらいなので、enumをよく 使用しています。 以上、ご参考になりましたでしょうか。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
□変数名の前には型を現す文字を書かない ユーザ定義型は無限であり、対処できない。 □関数の復帰値は、一旦必ず変数に代入しない。 必要に応じて決めることであり、規約にするのはナンセンス。 □if文には、極力「!」(NOT)を使用する。 真のとき空の{}が現れるよりずっとマシ。 □if文の判定には必ず定数値を右辺に持ってくる。 人間の思考順序に合わせないと混乱する。 □while(1)は、積極的に利用する。 無限ループを作りたいならこれが最も楽。 といった意見もあります。
- omi3
- ベストアンサー率20% (72/359)
組織を移動したとき、方言を矯正させられますが、 その対処方法はお考えですか?
補足
移動の意味を教えてください。 人の異動のことですか?
- 1
- 2
補足
意見は分かりました。 で、あなた自身の規約は無いのですか? その日の気分で次第でデタラメに書いているのですか?