2012-04-14 21 views
2

.hにC++クラスを定義し、そのメソッドを.cppで定義しますが、コードの外観が不規則になります。クラス定義全体を ".h"に入れると、実行可能ファイルが大きくなりますか?

.hファイルにあるクラス定義にすべてのメソッドの定義を入れたいのですが、別のファイルによってクラスヘッダーファイルが含まれている場合、コンパイラが同じメソッド/関数の重複コードを生成することが心配です。

リンカーは重複したコードを見つけてマージしてファイルサイズを縮小しますか?

そうでない場合は、代わりに.hppを使用する方が良いですか?私は.hppがこれのためだと聞きました。

.hファイルを.hpp(私は理由はわかりません)に変更しただけで、G ++でコンパイルしたときには少しの違いがあります。

答えて

0

あなたが必要なのはhere: Header files, pros and cons of putting all you code in themです。それが役に立てば幸い!

ヘッダーファイルを使用すると、コンパイル時間が短縮され、実行可能ファイルが小さくなります。また、.h宣言を見れば、クラスの概要を知ることができるので、かなり洗練されています。

+0

オフサイトへのリンクは良い答えではありません。あなたはリンクを提供するだけでなく、ここに質問に答える必要があります –

+0

@DavidHeffernan:リンクはstackoverflow.comを指していますどのようにオフサイトですか? (私はあなたの声明の要点にもかかわらず、同意する) – bitmask

+0

また、実際に直接質問に答えるわけではありません。 –

0

あなたは何も心配する必要はありません。どのように壊れているのかはまったく違いはありません。ファイルと記述されているため、その説明がどのように広がっているのではなく、大きくなります。

.hまたは.hppも違いはありません。

+1

おそらく唯一の違いは、テキストエディタは '.h'をCとしてハイライトし、' .hpp'はC++としてハイライトするということです。そして定義の配置が重要である理由についてのNawazの答えを見てください。 –

+0

リリース/最適化のためにコンパイルしている場合、非常に疑問があります。 –

3

はい。 大きな実行可能ファイルを作成するのは、定義内にキーワードinlineがあるかどうかにかかわらず、クラス自体で定義されているメンバー関数がinlineデフォルトではであるためです。通常、inline関数は、より大きな実行可能ファイルを生成します。なぜなら、コンパイラは、どこから呼び出されても何度も定義するからです。 .HPP対

+0

異なるコンパイル単位を動的にリンクさせるという問題もあります。このため、実行可能ファイル自体を大幅に減らすことができます。 –

1

の.hは、一部の人々は、彼らが排他的なC++プログラミングをやっているとき.hppを使用することを好む

#include <cmath> vs #include <math.h> 

の90%の等価です。あなたはBoostのような図書館の.hppを見るでしょう。

しかし、他の10%は本当に重要です。

ほとんどのBoostライブラリのヘッダのみされています:彼らは、ヘッダーの完全テンプレートやインライン関数を含む ファイルで構成し、無必要 例えば、Boostライブラリドキュメントから取って、彼らは.hpp.h以上を使用しての理由を説明します個別にコンパイルされたライブラリー・バイナリーまたは特殊処理( リンク時)。

この場合は、.hppを使用する必要がありますが、これはコンパイルに時間がかかることがあります。それ以外の場合は、.hのスタイルを維持することができます。それは私の個人的な好みです。私の正直な意見では、それは全くC-orientedではありません。

さらに読書:

Splitting templated C++ classes into .hpp/.cpp files--is it possible?

Condensing Declaration and Implementation into an HPP file

C++ templates declare in .h, define in .hpp

+0

ブースト・ドキュメントの引用には、なぜファイル名を '.hpp'ではなく' .hpp'にするのか説明していません。 –

0

大きな実行ファイルについての質問に答えるために、はい、それはあなたの実行ファイルが大きくなります。ソースファイルまたはヘッダーファイルのヘッダーファイルを#includeすると、プリプロセッサは#includeをヘッダーファイルの内容で置き換えます。次のヘッダー保護をあなたのヘッダファイルを保護する必要がある理由はここにある:あなたが(関数定義を持っている)ヘッダファイルを含める場合

#ifndef HDR_H 
#define HDR_H 

... 

#endif 

ただし、リンカエラーが発生しますの一部である複数のファイルに同じ実行可能ファイル。クラス定義と関数定義と宣言をそれぞれ.cppファイルと.hppファイルに分割することをお勧めします。これにより、リンカーの頭痛の量が大幅に減少します。

また、.H = .HPP。どちらを選ぶかは関係ありません。個人的な好み...