• ベストアンサー

C/C++ ソースのコーティングについて

最近、C/C++ ソースのコーディングに関して興味を持ちました。 そこで質問します。 皆様は普段プログラムを書くときにどんなコーディングをしていますか。 人それぞれ記述が異なると思いますが、何か自分の中でのコーディング・ルールが あれば教えて下さい。できるだけ詳しくお聞きしたいです。 ちなみに私の場合は (1)return、sizeof 演算子には必ず括弧を付けます。 (2)if、else、while、for には必ず{、}のブロックを記述して省略しません。 (3)関数を呼び出すとき、引数と引数はスペースを必ず挿入します。→strcpy( s, t );  ただし、if、while、for の条件式の中ではスペースを入れません。→while ( fgets(buff,sizeof(buff),fp) != NULL ){ … } (4)2項(3項)演算子はスペースを両端に挿入します。→ret = 2 + 3;  単項演算子はスペースは挿入しません。→i++、*str (5)ブロックのインデントは  if ( 条件式 ){   処理  }  else{   処理  } などがあります。 特に詳しく知りたいのは(5)です。 タイプ1 if ( 条件式 ){  処理 } else{  処理 } タイプ2 if ( 条件式 ){  処理 }else{  処理 } タイプ3 if ( 条件式 ) {  処理 } else {  処理 } タイプ4 if ( 条件式 )  {  処理  } else  {  処理  } それではコーディング・ルール(こだわり)などを教えて下さい。 なお、今回の質問は、より見やすいコーディングを目指しての質問です。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

Unixで使うEmacsでは字下げ動作をカスタマイズする機能が用意されていて コーディングスタイルに名前がついています。 名称は以下のようになっております。 CC-MODE  デフォルトのコーディングスタイルで、他のスタイルはすべてここから派生している。 GNU      Emacs自体とGNU関連のプログラムのCコードに使われるスタイル K&R      古典的教科書Kernighan&Richie著「The C Programing Language」のスタイル BSD      UNIXのBSDバージョンのコードに使われるスタイル Stroustrup    標準の参考書BjarneStroutstrup著「The C++ Programing Language」のC++コーディングスタイル。 Whitesmith    Whitesmith社のC/C++コンパイラのドキュメントで使われるスタイル Ellemtell     スウェーデンのEllemtel Telecommunication Ssystems Laboratories社のスタイル                     「入門 Gnu Emacs」(Debra Cameron著、オライリー・ジャパン)より プログラマーは、プロジェクトや職場のやりかたにあわせることが多いみたいですが 参考にして下さい。

Oh-Orange
質問者

お礼

新情報の回答をありがとうございます。 コーディングのスタイルを複数用意してその場で合わせる考えですか。 今までの仕事では、コーディングのスタイルに関しての決まりがありませんでしたが、 会社によっては決められたスタイルがあると聞いた事がありました。 私はK&Rのコーディング・スタイルくらいしか本で見たことがなかったので とても参考になります。 ありがとうございました。

その他の回答 (5)

  • m_mik
  • ベストアンサー率26% (31/117)
回答No.6

10人でプロジェクトを組めば、10人全員が違ったコーディングをするというぐらい、様々なコーディングルールがありますよね。 (まとめ役の人は、いつも大変です) もちろん、プロジェクトで決まったコーディングルールがあればそれに従いますが、1人だけでプログラムを組む場合にはということで… (1) return、sizeofにはつけない。 特にreturnは#4さんの仰ってる通り、関数と混同されるのを避けるためです。 (2) 昔は{}の省略を行うようにしていたのですが、今は必ずつけるようにしています。 後でデバッグのときにprintfを挿入したりするときに面倒にならないためという感じです。 (3) 関数への引数は、strncpy(src , dst);のような感じで書いています。 普通はstrcpy(src, dst)の様に書くと思うのですが、くっついていると見落としてしまうかも知れないということで離しています。 if、whileの場合には、if、whileの直後を空白にしています。 while (fgets(buff , sizeof(buff) , fp) != NULL) のように… ifやwhileの後を空けるのは”関数ではない”ということを分かりやすくするためにという感じです。 (4) 同じ記法です。 (5) インデントの揃え易さから if (条件式) {   処理 } else {   処理 } のような感じで記述しています。 この記法は、自然と行が増えるので管理している方からは嫌がられます。(笑)

Oh-Orange
質問者

お礼

回答ありがとうございます。 exit() 関数と同じ感覚で return() を今まで使ってきましが、 やはり return、sizeof にはカッコはつけない方が良さそうですね。関数ではないし。 (3)の仮引数の記述を最近このQ&Aで知りました。 この方法も見やすいですね。 私も if、while などは空白を1つ必ず入れています。これは m_mik さんの仰るとおりで 関数ではないと分かりやすくする為に入れています。return なども合わせるべきですね。 あとブロックのインデントはタイプ3は行数が増えるのでタイプ1にしていますが、 最近タイプ2に変えようかと思っています。理由はエディタの機能で{ }文字の対応位置の 移動機能があり、CTRL+[ で{→}へ、SHIFT+1 で行の最後に移動することで if、else if else のブロックに数個のキーで移動できるためです。その他、タイプ1の表記に似ているので 馴染みやすいからです。 今回の質問は、いろいろなご意見を聞けたのでかなり満足しています。 これらの回答より、これからのコーディングをもう一度考えて行こうと思います。 うろ覚えで使っていた言葉(コーディング)も含め参考になりました。 コーティングじゃなかったですね。何?この言葉?でも意味が通じてよかったです。 皆様、貴重なご意見を有り難うございました。 以上をもって締め切ります。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.4

1) sizeof(型名)の場合は括弧が必須なのでつけますけど、それ以外はsizeof 変数 の場合なども含め付けません。 括弧があるとtypoがエラーにならない(retrunという関数があると認識されてコンパイルは通る)とか 理由はありますが、昨今のエディタは色が付くので見れば分かったりもします。 (実機でviとかだと色が付けられなかったりすることもあるので、時に有用ですけど) 2) これは省略しません 。 3) strcpy(s, t); 4) ret = 2 + 3; i++、*str 5)   if(条件式)   {     処理   }   else   {     処理   } ハンガリアンは使ってません。ラクダ表記も使ってません。 boostやISO/IEC14882(C++の言語仕様書)のコード同様に、小文字ベースで命名してます。 # これがJavaで書くとなれば、Sunの標準にあわせてこんな感じになりますが。 #  if (条件式) { #    処理 #  } else { #    処理 #  } # C++ならdata_numberだし、JavaならdataNumberと書く。 # (それ以前に「でーたなんばー」なんて内容の分からない名前つけないけど…例に合わせて) 10 == a のような逆転は昔やってましたが、コンパイラがちゃんと警告してくれる 時代になったので、読みにくいし止めました。 JavaDoc/Doxygenは私も使ってますので、コメントは勢いこの形式になります。

Oh-Orange
質問者

お礼

朝早くからの回答をありがとうございます。 return 文に括弧はつけるな!というのは昔、本で読んだ記憶があります。 確かに括弧を付けなければ retrun のタイプミスがコンパイルエラーで検出されますね。 普段、ワーニングレベルは一番(高=W4)に設定していて、警告メッセージをエラーにする オプションを付けています。それでも retrun() 関数があるとリンクエラーにもなりませんね。 昔のことを思い出しました。最近、return 文に括弧を付けるべきかどうか考えていたので sizeof も含めて参考になりました。 あと JavaDoc/Doxygen は便利そうですね。 これからコーティング方法を少し新しくしようと思っています。 ありがとうございました。

  • Interest
  • ベストアンサー率31% (207/659)
回答No.3

コーディングスタイルは百人百様ですよね~。育ってきた文化が見える気がします。 私は、仕事ではその部署/製品で使われているコーディングスタイルに合わせています。個人的には、Windowsのプログラミングでよく見かけるハンガリアン表記は嫌い。 参考:ハンガリアン表記http://live.under.jp/todashou/tips/code_writting/notation.html 仕事を離れた趣味のプログラミングではJavaのコーディング規約をC++風にアレンジして、コメント文のつけ方はDoxygenでソースコードから仕様書に引っ張り出せるようJavaDocスタイルにしています。 参考:Doxygen http://www.doxygen.jp/ 細かい「マイルール」では、 比較演算では、定数を左に置く。 × if( a == 10 ) ← if( a = 10 ) のような間違いを防ぐため ○ if( 10 == a ) とか。 (5)ブロックのインデントは、以前はタイプ1でしたが、最近はタイプ3を使っている気がします。というのは、新しく使い始めた統合開発環境のエディタが勝手に直しちゃうからというのと、中括弧のはじめと終わりが同じ列にあったほうが対応関係が分かりやすいから、という理由からです。

Oh-Orange
質問者

お礼

回答ありがとうございます。 私も最初は Windows のハンガリアン表記が気に入りませんでした。 ハンガリアン表記のことは C 言語を学んだ最初から知っていましたが、違和感があって 馴染めませんでした。今は Windows のプログラミングを行っているためか慣れましたし、 考え方を変えました。前は data_number という感じでアンダースコア文字で区切っていました。 今は nDataNumber という感じで大文字と小文字を混ぜてアンダースコア文字は記号定数の 時しか基本的に使いません。 あと JavaDoc スタイルに興味が出ました。ちょっと調べてみます。 ありがとうございました。

noname#38837
noname#38837
回答No.2

if文は処理が短いときは{}をつけないこともあります(例外処理などに飛ばすとき等) if (a) func(); とか。 また、elseがある場合は if (a) { .... } else { .... } という風に書きます ()の前後と,の後と演算子の前後はスペースを入れてます 宣言時、 型* 変数名; ではなくて 型 *変数名; と書きます ですがこういう記述は些細なことだと思ってます 人によって違うのはあまり気にしないですし 開発環境のサポートがあるので ソースをエディタでベタ打ちしていたころと比べたらゆるくなってます あとは引数を改行して書くとき func( a  ,b ,c ) という感じでカンマを先につけてしまいます 引数の追加削除がしやすいので。

Oh-Orange
質問者

お礼

参考になる意見を待っていました。 引数を改行してカンマを前に出すのは『なるほど』感心しました。 見やすい以外にカンマの追加、削除のしやすさには気づきませんでした。 私も引数が多き場合は、引数単位で行分割していますがカンマはいつも最後でした。 考え方の参考になります。 ありがとうございました。

  • plantarum
  • ベストアンサー率53% (42/79)
回答No.1
Oh-Orange
質問者

お礼

回答ありがとうございます。 コーティングについての本があるのですね。 前に本屋で『プログラミング作法』という本をぺらぺらと読んだことがありましたが、 リンクで紹介されている本も興味深いですね。 本の紹介ありがとうございました。

関連するQ&A