• ベストアンサー

【VC++2005】ソースの書き方:コーディングを****.hのファイルに書いてもいいでしょうか?変数名の命名規則はありますか?

VC++2005の超超初心者です。 現在、VC++2005(Express Edition)でCLRでプロジェクトを つくり、いろいろとコーディングしています。 今まで、参考書「作って覚えるVisual C++ 2005 Express Editon」 を利用して、半分泣きながらコーディングしていました。 その参考書では、コーディングを*****.cppでなく、 ****.hのファイルにすべて書いているのですが、いいものでしょうか? 先輩が残していったVC++6.0のソースを見ると、cpp内に書いていますが どちらがよろしいでしょうか? また、他の参考書を見ると、変数名の先頭に「m」をつけていますが、 何か意味があるのでしょうか? (変数名をつける時の作法ってありますか?) せっかくなら、きれいなソースを書きたいと思うので、 詳しい方いましたら、ご教授頂きたく思います。

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8525/19381)
回答No.2

幾つかの.cppで同じものを定義する必要があるもの→.hに定義を書く 1つの.cppで1回しか定義しないもの→.cppに書く ・幾つかの.cppで同じものを定義する必要があるものの例 #defineの定義 関数のプロトタイプ宣言 typedefの定義 structの定義 classの定義 など。 ・1つの.cppで1回しか定義しないものの例 グローバル変数の実体の宣言 関数の実体の宣言 クラス変数の実体の宣言 構造体変数の実体の宣言 など。 例えば、t1.cpp、t2.cpp、t3.cppの3つのソースで #define INPUT_BUF_MAX 256 の定義が欲しい場合は -------t1.cpp------- #define INPUT_BUF_MAX 256 -------t2.cpp------- #define INPUT_BUF_MAX 256 -------t3.cpp------- #define INPUT_BUF_MAX 256 と書いてはいけません。書くなら -------t.h------- #define INPUT_BUF_MAX 256 -------t1.cpp------- #include "t.h" -------t2.cpp------- #include "t.h" -------t3.cpp------- #include "t.h" と書きます。 もし「256を512にしよう」と思ったら「t.hの256を512に直して、再構築」で済みます。 もし、最初の書き方で、t3.cppだけ直し忘れると -------t1.cpp------- #define INPUT_BUF_MAX 512 -------t2.cpp------- #define INPUT_BUF_MAX 512 -------t3.cpp------- #define INPUT_BUF_MAX 256 になっていると「t3.cppだけ数字が違ったままになっていて、バグが出る」でしょう。 このように「共通の定義や宣言は、.hに書く」のです。

yuki7091
質問者

補足

ご回答、ありがとうございます。 非常に分かりやすく書いていただきありがとうございます。 この方法で、現在コーディングさせていただいています。

その他の回答 (4)

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

> VC++2005の超超初心者です。 超超初心者なら、まずは汚くてもよいので、とにかく動くものを作ることを目指しましょう。 それを何度か繰り返すうちに、汚いコードの問題点を体感できるはずです。 綺麗に書く練習をするのは、それからでも良いと思います。 そうでないと、他人の意見を鵜呑みにするしかなくなります。これでは、どんなコーディング規約も形骸化してしまいます。

yuki7091
質問者

補足

ご回答、ありがとうございます。 おっしゃるとおり、書いて動いてなんぼですよね。 しかしながら、後々自分以外の人が修正したり機能拡張したりする場合 を考慮したいと思ったため、このような質問をさせて頂きました。 とにかく、たくさんのソースを書いていこうと思います。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

VC2005/2008等でWindowsFormでアプリをデザイナを使ってプログラミングするなら ヘッダーファイルの中に実装コードを書くほうが都合がいいかもしれません 一般的な C/C++の場合は 宣言、定義などをヘッダーに集め 実装コードは C/CPPファイルに といったスタイルが多いと思います C++/CLIでも ヘッダーに宣言のみ CPPファイルに実行コード といった分離は可能です ただし、イベントハンドラなどのデリゲートを追加したりする部分を 自前でコード化するのか IDE(デザイナ)でやるのかでコーディングの量は変わってくるでしょう ハンドラをデザイナで追加して手作業で実行部分を分離するなら private: System::Void Form1_Load( System::Object^ , System::EventArgs^ ) { } といった記述を ヘッダー内では private: System::Void Form1_Load( System::Object^ , System::EventArgs^ ); としておき cppファイルに #include "Form1.h" using namespase プロジェクト名; System::Void Form1::Form1_Load( System::Object^ , System::EventArgs^ ) {   MessageBox::Show( L"Sample", L"Test" ); } といった具合にします private:は削除して関数名の前にその関数が属するクラス名を追加します

yuki7091
質問者

補足

ご回答、ありがとうございます。 サンプルソースを載せて頂いているので 非常にわかりやすいです。 現在、紹介頂いたサンプルソースを使用して コーディングさせて頂いております。

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

基本的に *.hは関数やクラスの"インターフェース"(宣言)を書くもの、 *.cppはそれらの実装(定義)を書くものです。 STLなどの場合は拡張子が付かない "ヘッダ"を用います。 しかし、拡張子がないだけで 役割は*.hとなんら変わりません。 最近はヘッダと実装の区別があいまいになり、 ヘッダに実装まで書く(厳密には、書かざるを得ない) ケースも多いようです。 その典型が"テンプレート"でしょう。 例えば、リングバッファ 先頭と最後をつなげて"輪"のように使うバッファです。 基本的にはバイト単位で入出力できるタイプがあれば 用が足りるのですが、 効率化、プログラムの見通しの良さ などを考え 例えば、WORD(2バイト)単位で入出力したい時が あります。 わざわざ、2つを実装するのも面倒です。 こういうとき テンプレートを使えば 1つの実装で両者に対応可能になり、 非常に便利です。 しかし、"テンプレート"とは 文字通り"型紙"でして、 実際に使用される際に、 指定された型に応じて展開されていくものです。 複数のモジュール(*.cpp)で片方(A.cpp)はBYTE版、 他方(B.cpp)はWORD版を使いたいとき、 テンプレートの情報は共有するので ヘッダに共有する情報を書きます。 しかし、テンプレートは実装全体を展開していきます。 つまり、A,cppもB.cppもテンプレートの実装全部を知らなければ 展開不可能です。 この場合、ヘッダに実装全てを記述せざるを得ません。 よく言われる事ですが "少ない知識で利用できるほどよい" のであって その点では "実装を丸ごと取り込む" のは最悪ともいえます。 だから、"テンプレートはダメ" というのも非常に偏っていると考えます。 原則を踏まえつつも 柔軟な対応が必要 ではないでしょうか? 要するに ”ケース・バイ・ケース" であり 場合によっては ヘッダに定義まで書いてもOK という考えです。 最近ではSTLに代表されるように "テンプレート"ベースのライブラリも多くなってきました。 また、ソースを生成する "ウィザード" などでは ヘッダに実装まで生成させるものも多いようです。 特に .NET(ドットネット)系に多く見られます。 スクリプト系の言語をも考慮したためでしょうか? VC6よりも2005/2008が汚く見えるのは そのためと思われます。 あと、メンバー変数の頭にm_が付くのは マイクロソフトが昔から勧めてきた方法です。 この場合の"m"は”member”の略と理解しています。 "my"の略ではないと思います。 メンバー変数はオブジェクトの状態を表すことが多く、 とても重要です。また、"カプセル化"に伴い 関数パラメータの格納先となることも多いのですが、 この際もメンバー変数を簡単に見分けられる方法として m_はなかなか良いアイディアだと思います。 私も愛用しています。

yuki7091
質問者

補足

長文にわたるご回答、ありがとうございます。 申し訳ございませんが、私の現在の知識ですと ご説明頂いた内容は難しいようです。 しかしながら、VC++6.0とVC++2005は違うようですね。 「ケースバイケース」という時が自分でわかるレベル になるように、勉強いたします。

noname#154655
noname#154655
回答No.1

参考書ではスペースの関係上「.h」に書いてあるだけです。 出来るだけ「.cpp」に書いた方がいいです。 変数名の先頭に「m」をつけているのは、 多分ですが、「my」(私の)の「m」、つまり、 私が作ったものという意味だと思います。

yuki7091
質問者

補足

早速のご回答、ありがとうございます。 どうして、cpp内にソースを書いたほうが宜しいのでしょうか? ****.hはヘッダーファイル(?)というものだから、 宣言のみ書くことが一般なのでしょうか? 例外はありますか? 矢継ぎ早の質問ですみません。

関連するQ&A

  • 【VC++2005(CLR)】ファイルが他で使用されていると、落ちてしまう

    VC++初心者です。 現在、VC++2005 express edition、CLRプロジェクトでコーディングしております。 質問のタイトルをもう少し具体的に説明しますと、 あるファイルを開きっぱなしにして、 そのファイルを読みにいこうとするとプログラムが落ちてしまいます。 これを回避するにはどうしたら宜しいでしょうか? もし、読みたいファイルが使用中でも、使用終了されたら、 すぐにそのファイルを読みに行くことは可能でしょうか? お手数ですが、よろしくお願いします。

  • VC++のコーディングについて

    VC++初心者です。 VC++のWindowsフォームアプリケーションを使用してテストプログラムを作ってみようと思っています。 初歩的な質問ですみません。 VC++でWindowsフォームアプリケーションを作成する場合、 フォームのヘッダーファイル(Form.h)にコーディングしていくものなのでしょうか? ボタンクリック処理など、ヘッダーファイルに作成されてしまいます。 私の先入観で、cppファイルにコーディングするものだと思っていたのですが、 VC++のWindowsフォームアプリケーションとは、こういうものでしょうか? ヘッダーファイルにコーディングするという感覚が何だか気持ち悪いです。 また、VC++を使用してWindowsアプリケーションを作る勉強がしたいのですが、 「初心者でも分かる+オススメの参考書籍」がありましたら、教えていただけると幸いです。 基本的な質問で意味不明かもしれませんが、ご回答いただけると助かります。 よろしくお願いします。

  • VC++でソースファイルに2つのデータを作る場合。

    Microsoft Visual C++ 2008 Express Editionというコンパイラを使っています。 新しいプロジェクトを作成すると、ソースファイル、ヘッダーファイル、リソースファイルの3つのフォルダが作成されます。 ソースファイルのフォルダに.cppのプログラムを作成しています。 もう一つ別のプログラムを実行しようと思って、ソースファイルのフォルダにプログラムを追加して実行すると必ずエラーが出てしまいます。 エラーの内容は「1 つ以上の複数回定義されているシンボルが見つかりました。」のようです。 1つのソースファイルに2つ以上のプログラムは作れないのでしょうか?

  • 【VC++2005(CLR)】ラベルやテキストボックスの背景色を変化させたい

    VC++初心者です。 現在、VC++2005 express edition、CLRプロジェクトで コーディングしております。 ラベルやテキストボックスの背景色を変えるには どうしたら宜しいでしょうか。 以下のようにコーディングしたのですが、色が変わってくれません。 他に何か設定が必要なのでしょうか。 label->ResetBackColor(); label->BackColor.Red;

  • 【VC++2008】2つのmain()を1つのプロジェクトに含める方法

    【VC++2008】2つのmain()を1つのプロジェクトに含める方法 現在、WinXP proで、VC++2008 Express Editionを使用しています。 1つのプロジェクトでmain()がある2つのソースを 使い分けたいのですが、その方法を教えて頂けませんでしょうか。 (うろ覚えですが、VC++6.0の頃にはできたと思います。) 例えば、以下のような2つのソースを含んだ1つのプロジェクトの 設定方法を教えて頂きたくお願いします。 ※ソースを見やすくするため、全角スペースを入れています。 //ソース名:main01st.cpp #include<stdio.h> void main(){   printf("main01\n");  } } //ソース名:main02nd.cpp #include<stdio.h> void main(){   printf("main02\n");  } }

  • 【VC++6.0】ソースコードの文字の大きさを変更させるには?

    いつもお世話になっております。 VC++初心者です。 VC++6.0 enterprise editionを使用していますが、 表示されるソースコードの 文字の大きさを変更できずに困っています。 (VC2005 express editionではできたと思います。) ご存知の方がいらっしゃいましたら、ご教授下さい。

  • コーディング規則

    私のいるグループ内において、コーディング規則みたいなものを 決めようと検討しています。 例えば、 ・インデントは「Tab 4」にする ・コメントのフォーマットを決める ・関数名、変数名のネーミング規則を決める など。 他人が見ても理解しやすいコード体系にし、レビューも効率的になり、 バグの検証時にも役に立つと考えています。 また、今後、開発担当者から別の人に移管するときにも役立つと考えます。 そこで、みなさんにお聞きしたいのは、以下のことです。 ・どういう事項をルール化すると役立つか ・参考になるURL、書籍はありますか 識者の方、ご教授願います。

  • 【VC++2005(CLR)】マルチスレッドを使用したソースについて

    いつも大変お世話になっています。 VC++初心者です。 現在、VC++2005 CLRプロジェクト(C++/CLI)で コーディングしています。 マルチスレッドを使おうと思い、他のページを参照して 以下のソースを書くと 以下のエラーメッセージが出ました。 どのように対処すればよいか、ご教授頂けませんでしょうか。 エラーメッセージ >delegate コンストラクタの引数が無効です。デリゲート ターゲットはメンバ関数のポインタである必要があります。 ****************** private: System::Void ProjectA_Shown(System::Object^ sender, System::EventArgs^ e) {  System::Threading::Thread^ t =   gcnew System::Threading::Thread(   gcnew System::Threading::ThreadStart(SendData()));  t->IsBackground = true;  t->Start();  t->Join(); } private: System::Void SendData(){  //データを送る処理 } ****************** ※表示のため先頭に全角スペースを入れています。 以上、よろしくお願いしたします。

  • 【VC++2005(CLR)】ダイアログ呼び出し元ダイアログを手前に表示させたい

    VC++初心者です。 現在、VC++ express edition、CLRプロジェクトでコーディングしております。 いろいろな方の力を借りて、モードレスでダイアログ(子ダイアログ)を 呼び出しだすことができました。ありがとうございました。 しかしながら、常にその子ダイアログが呼び出し元ダイアログ(親ダイアログ)の手前に 表示されてしまいます。 各ダイアログがクリックされるたびに、クリックされたダイアログが手前に表示する ようにできませんでしょうか。 よろしくお願いします。

  • 【VC++2005(CLR)】ダイアログ右上の最小化、最大化、閉じるボタンの制御の仕方を教えてください。

    VC++初心者です。 たびたび、お世話になっております。 現在、VC++2005 Express Edition、CLRのプロジェクトで コーディングしています。 基本的な質問だと思いますが、ダイアログ右上に配置される 最小化、最大化、閉じるボタンの制御の仕方を 教えていただけませんでしょうか。 具体的にはやりたいことは、以下のようなものです。 ・閉じるボタンを押されたら、MessageBoxを表示させる。 ・他のダイアログのボタンから別のダイアログの最大化ボタンが  押されたことと同じ動作をする。