Entry

プログラミングメモ - C++ のソースをヘッダと実装に分ける理由とか

2009年06月26日

こちらから。

(C++)メソッドの機能分割を進めていくと,メソッドをヘッダファイルとソースファイルに分けるメリットが感じられないのですが,そういうものでしょうか.

(C++)メソッドの機能分割を進めていくと,メソッドをヘッダファイルとソースファ... - Yahoo!知恵袋

この方は,ライブラリを公開するとき,実装(定義)もコンパイルせずにソースのまま一緒に配るつもりなんだろうか。いやこれ,ソースの中身が見られるのが嫌ってなことではありません(ま,それもあるんだけど)。そうではなくて,ライブラリの利用者側にコンパイルさせる(翻訳単位をライブラリの利用側でひとつにしてしまう)ことが問題だったりする。

宣言と定義を一緒に書いてしまうと,そのライブラリを利用する側は,使うソースがあるたびにそれをコンパイルしなくちゃいけません。名前解決できればいいだけなのに,コンパイルまでしなくちゃいけないのは,利用者にとって不便です。

回答では Java との対比があるけれども,Java の場合 import するモジュールは,コンパイル済みのファイル(*.class, *.jar)があることが前提になっているので,上のような問題は起きません。言ってみれば,Java の import は,コンパイルに必要な名前解決だけでなく,リンク先の解決にも使われるわけで(C++ のリンクとはかなり意味が異なるが),結局のところ,ライブラリの利用者は自分のソースだけをコンパイルすればいいことになる。

また,C/C++ の場合,ヘッダを利用して効率的に分業することもあります。

例えば,実行モジュール X を作るときに,ライブラリ A とライブラリ B が必要だとします。B は A に依存していて,X は B を直接使うとする。こゆ場合,B の開発者さんは,ライブラリを作るときに,A の名前だけを解決できればいい場合が多かったりします。

例として,ライブラリ A にある void A::func() を呼び出す場合なんかは,この関数の名前解決だけさせれば B のコンパイルが通ります。で,A のライブラリがなかなかできない場合でも,A のヘッダだけをもらえれば,中身(実体,定義)がなくても B のコンパイルを通すことができるわけで,A の進捗に関わらず作業を進めることができるというわけ。A の中身はリンクするとき,つまり B と A の結合テスト時までにできていればいい。

翻訳単位を分けることで,効率的に分業できる(場合もある)というわけ。

というか,ヘッダに書くものは(なるべく)コンパイルしなくていいものだけにしとき……と。テンプレートやインラインメソッドは,呼び元で実体化されるからしゃーないにしても。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN