• ベストアンサー

今風(?)のコーディング規約が知りたい

C++ は初心者です。他の言語は結構長くやっております。C は多少経験があります。(が、知識が 10 年くらい前のものです) 趣味で C++ を始めたのですが、仕事や大きなコミュニティ内で使ったことがないために、今現在主流のコーディング規約というかお行儀の良いスタイルの判別が難しいです。ヘッダファイルや Google Codesearch 等で片っ端から色々なソースを見ているのですが結構バラバラなんですよね・・・ 他の言語の経験があるので、switch の最後には何もなくとも default を明確につけとけ みたいなことの有用性はわかるのですが ではなくて、細かいですけど if (hoge) { } なのか if (hoge) { } なのか、とか (自分は下の方が好き) int ←ここで改行する?(自分は改行する) hogeHoge() { ・・・ とか。 多分僕の個人的な好みは大昔にやった C (K&R スタイル?) や長く仕事で使っている Perl の影響が強い気がするので、C++ 的にはどうなのかなと。 変数名や関数名は GNU スタイルなのか キャメルスタイルなのか、キャメルスタイルだったら大文字から始めるのか、関数名だけ大文字から始める人もいれば、関数名も小文字からの人もいるし、enum の定数は全部大文字が普通?とか(きりないですorz)・・・ ハンガリアンはもう推奨されてないというのは理解してます。その理由もなんとなく。でもハンドルは hHoge にするのが普通みたいですし、bool型なら is~ とか can~ とか。人によってはグローバル変数にもプレフィックスつけるようですね。他にもそういうこれはプレフィックスつけるのが普通!ってのがあったら知りたいです。僕自身はめっちゃ長くなっても意味が正確にわかる変数名をつけとけ派なので、プレフィックスにはあまり必要性を感じないです。(英文みたいな変数名とか良くやる) でも、 C++ 長くやると多分考え方が変わるかなあと思うので。 とりあえず以下を読んでますが、それほど間違った選択はしていないでしょうか? http://sec.ipa.go.jp/download/dl.php?filename=report/200606/CMGuide_V1-0.pdf http://www.possibility.com/Cpp/CppCodingStandard.html それはもう古い、今はこういう感じが普通、というのがあったら教えていただけると幸いです。(英語でも構いません) 個人で趣味レベルでやるなら、その程度は好きにしてかまわんでしょう、という意見でも OK です。好きにするんでも一貫したいので、どうせなら良いものを参考にしておきたいとは思ってます。(目的のモノを動かすのに数時間もかからなかったのに、そのコードをお行儀よく書き直そうとして数日も定まらずに何度も書き直したり・・・な状態なので。)

noname#98692
noname#98692

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

とりあえず、ピアソン・エデュケーションの『C++ Coding Standards』を読んでみてください。

参考URL:
http://www.pej-hed.jp/washo/459.html
noname#98692
質問者

お礼

おー こういうのが知りたかったんです。ありがとうございます。もう Amazon で注文しました。ざっと検索した感じ、書評書いてる人の傾向とかから良さを十分感じましたし、値段もお手ごろだったので。 STL にも触れられているようで楽しみです。 (C++ 初めて数時間でやっと STL の存在に気づく→かき直す→STL も色々描き方あるみたいだな→何がお行儀良いのかわっかんねー だったので)

その他の回答 (1)

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.2

私は”プログラミング作法"を参考にしています。 http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E4%BD%9C%E6%B3%95-%E3%83%96%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3-%E3%82%AB%E3%83%BC%E3%83%8B%E3%83%8F%E3%83%B3/dp/4756136494 グローバル識別子には長い名称 ローカル識別子には短い名称 for (int Index = 0; Index < n; ++Index) × for (int i = 0; i < n; ++i) ○ 一例です

noname#98692
質問者

お礼

ありがとうございます。参考にしてみます。 (No.1 さんのを注文してしまったので二冊すぐというわけには・・・) 一時的なローカル識別子には短い名称、には同意です。 普段、長い名前付けるのはメンバ変数ですね。

noname#98692
質問者

補足

表紙を見てなにかう~んと思ってたのですが、この本、知人の職場にあったので少し読んだことがあるような気がします。

関連するQ&A

  • あなたのC言語コーディング規約

    勤務先・学校・趣味でC言語を使用してプログラムをしている方の多くは組織内で決めているコーディング規約に沿ってプログラムをしていると思います。 しかし、全てに関して規約化されていることは少なく、ある程度プログラマの裁量に任せていることがあると思います。 そこで、質問です。 「あなたの中で決めているコーディング規約は何ですか?」 「また、その理由は何ですか?」 私が決めているコーディング規約を一例挙げると以下の通りです。 (基本は他人が見ても直ぐに理解できるように心がけてます。) ------ □変数名の前には必ず型を現す文字を書く 理由:観ただけで型が分かるから。 例 :int型は、iData    char配列は、stData    ポインタは、pData □関数の復帰値は、一旦必ず変数に代入する。 理由:代入しないとデバックがしにくい。 例 :iRetCode=func();    switch(iRetCode){      case文    }    の、ように色んな値を試すときに不便。 □if文には、極力「!」(NOT)は使用しない。 理由:複数の論理和・積などが入った場合ややこしいので    elseで代用する。(真の時の処理はわざと書かない) □if文の判定には必ず定数値を左辺に持ってくる。 理由:if(iData=0)とかの"=="を"="にしてしまうミスを防ぐため。    (コンパイラによっては、警告が出るものもありますが…) 例 :if(0=iData)など □while(1)は、基本的に使用しない。 理由:無限ループに陥らないようにするため。 ------

  • [雑談]コーディング規約への思い

    今までに皆さんが体験されたことのある記憶に残るコーディング規約を教えていただきたいです。 これはお勧めとか、こんな酷い規約があった、自分専用ルール等、否定は無しで軽い気持ちで教えていただきたいです。 私の記憶に残る規約は下記があります。 [意外と良いかもと思ったもの] ・一文字のループカウンタの使用の禁止 少しでも検索を楽にしましょうと理由でした。 ×:for(i=0; i<10; i++){ ○:for(ii=0; ii<10; ii++){ [勘弁して欲しかったもの] ・if(2==ii)のように条件文を通常とは逆に書く。 ==の比較をタイプミスで=とした時にコンパイルが通らなくするためにらしいです。慣れるまで相当時間がかかりました。 ・3項演算子の使用禁止 読めなくて、理解もしなくてその前後のコードを修正する人が居て、使用禁止になったようです。。。 [自分専用規約] ・自分にごめんなさいと言うまで動的なメモリ確保はしない。 リーク対策です。動的にメモリを確保しないと実装できない場合や無駄にメモリを使用しすぎる場合にだけ、自分にごめんなさいをしました。 泣く泣く動的にとる場合はmallocではなくcallocを必ず使うようにしてました。 ・極力関数化 if文やswitch文が長くなる場合は、それを条件判断関数としてわざわざ関数を作る努力をします。 普通の処理も一連の流れなら必ず関数化します。 コードの可視性が上がりましたし、デバッグが楽になりました。 (ある関数をデバッグする場合、大半が関数化しているので戻り値だけチェックすればいいので) でも、関数1から関数2に飛んで、さらにその関数2から関数3に飛ぶ等全ての関数を追えば関数1に戻ってきた時に関数1の内容を忘れるような深すぎるのは禁止にしてました。 また関数名も相当こだわってました。 実はコメントを和英併記してくれと言われた時にコメント量を少なくする為にやってたのが癖になったのは内緒です。 ・無駄コメントの削除とconstの推奨 × int result = 0; result=NanikanoKansuu(); //NankanoKansuuが正常に処理したら if(result==0){ ○ int result = 0; const int normalProcess = 0; result=NanikanoKansuu(); if(result==normalProcess ){ ×のコメントを書くのはどうも抵抗がありました。戻り値なんてメンテなどでソースを追う際に読めばわかるやん!って思ってしまって。。。 それにアプリケーションの歴史が長く、メンテに次ぐメンテでコメントが良く間違ってるソースに当たり、コメントをあまり信用しなくなりました。 [微妙だと思った規約] ・プリフィックスの使用 仕様変更に伴いデータ型を変更する際に絶対に変数名の置換を忘れる!と確信できるメンバーがいる時に思いました。 考えればどんどん出てきそうですが、これくらいにしておきます。 見直すとレベルの低い発想が多いですね。ちょっと恥ずかしいです。

  • C/C++言語で変数名から変数のアドレスを取得する

    C/C++言語で変数名から変数のアドレスを取得する方法があれば、ご教示願います。 例えばですが、関数GetProcAddress()は、関数の文字列からエクスポート済みの関数のアドレスを戻り値で返しています。 GetProcAddress()と同じようにアドレスを取得したい変数名の文字列を渡して、変数のアドレスを取得したいです。 よろしくお願いします。

  • C言語で文字列操作を忘れてしまいました。

    長い間スクリプト言語ばかりやっておりまして、C言語に戻ると、文字列を返す 関数を作ろうとしましたが、お恥ずかしいながらできませんでした。 ローカル変数の値を戻り値に使おうとして、それがwarningになったり、動作が不安定になったりして、文字列を返す仕組みを完全に忘れてしまっていました。 例えば、"test"と言う文字列を返す関数を書きたいのですが、メモリ操作も考えた サンプルをだれか教えて欲しいです。 int main(void) { printf("%s", 「関数名」); }

  • 改行入り変数を改行を残したまま改行区切りで配列に入れる方法

    file()関数と同様の事を、ファイル名を指定ではなく変数名を指定して行いたいのですが、explode()関数だと改行(区切り文字)は削除されて配列に格納されてしまいます。とりあえず以下の2つの方法しか思いつかないのですが、どちらが効率的でしょうか? 又、他にもっと良い方法ありましたら教えて欲しいです。お願いします。 方法1 explode後、配列を再ループし末尾に改行コードを付与 方法2 strstrとsubstrで変数をカットしながら配列に格納

    • 締切済み
    • PHP
  • C++の変数の初期化

    C++を勉強中です。JavaやC#、JavaScriptといった言語はひととおり使えます。 C++におけるクラスHogeの変数hogeの初期化で、以下のふたつの構文では意味が違うようですが、どのように違うのでしょうか? Hoge hoge; Hoge hoge();

  • NULLの定義について

    C言語で、NULLとの比較を行う関数として、 strcmp関数を使用したいと考えています。 ある、文字列変数に、 "あいうえお"が入っている場合、 ""(何もない)の場合、 下記の例で真の処理と偽の処理、 どちらを通るのでしょうか。 当然、文字列変数が"あいうえお"の場合は、 真の処理を通ると思いますが、 ""(何もない)の場合が分かりません。 例として、 ~中略~ if( strcmp( 文字列変数, NULL ) != 0 ){ 真の処理 }else{ 偽の処理 } ~中略~ の時です。 言語によって、NULLは「0」と定義されていたような 記憶もありますが・・ したい事は、文字列変数が""の場合、 偽の処理をするようにしたいです。 プログラムの作り方を教えて下さい。

  • ユニークな文字列を順次, 生成する関数

    C++において, 適当な文字列を元に, ユニークな文字列を順次, 生成する関数を作りたいと思っています. (LISPで云う, 関数gensym()と似た役割を持つ関数です.) 例えば, "hoge"というstringを元に, "hoge0", "hoge1", "hoge4", "hoge8", "hoge100", ...., といったように, stringが互いに重複しないように, 適当な数字を連結した文字列を順次生成したいのです. 以下のように, 私なりの方法を考えてみたのですが, これだと, 今まで生成したstringを保存するhoge_setが必要になります. 何かより良い(シンプル, 効率的な)方法がありましたら, 教えていただけますでしょうか? よろしくお願い致します. (乱数を用いた方法) 1. 元となるstring型の変数nameを, "hoge" で初期化. 既に作成したstring文字列を保存する, set < string > hoge_setを宣言. 2. 乱数を生成し, それをnameにappendしたものを, string型の変数name2に代入. 3. 同じ文字列が存在したら, 2. に戻る. 同じ文字列が存在しなかったら, hoge_setに追加する.

  • コマンドを実行してコマンドライン文字列を読み込む

    C言語(他の言語でも)で、コマンドを実行して結果の文字列を取得できるような関数はないでしょうか? コマンドを実行したプログラム内の変数に文字列として保持して、処理したいと考えています。 Windowsです。 よろしくお願い致します。

  • c言語の変数一覧の取得

    c言語で書かれたコードについて、使われている変数名や関数名の一覧を取得することはできるのでしょうか? 何か方法がありましたら教えてください。

専門家に質問してみよう