/ 最近 .rdf 追記 編集 設定 本棚

脳log[20150609]



2015年06月09日 (火) [C++] なぜヘッダに実装を書くという発想になる?「【C++】なぜヘッダと実装はわけるべきなのでしょうか(.hに実装を書くことは邪道か)(10742)|teratail」■ファイルを分けるのが面倒でひとつにまとめるというのなら、それはヘッダを省略して実装ファイル(.cpp)のみにするということになると思うのだが。そうでないと複数か所から #includeされたときに定義が重複するのでリンクできない。「Big Sky :: ヘッダファイルだけでC++から使えるJSONパーサ「picojson」が凄い!」が成り立つのはヘッダがインラインとテンプレートで構成される特別な例だから。.cppひとつだけを用意したとして、その実装を利用する他のモジュールで必要なだけ(つまり、コンパイルを通すのに必要なだけ)関数プロトタイプやクラス定義(それとインライン関数とテンプレートのコピペなぞと extern const)を書けばいいんですよ。利用する場所ごとに同じものを何度も書いたり修正したりするのが面倒になったら、それらをまとめたファイル(拡張子は .hとか)を作って #includeするようにすれば自動コピペ完了。DRYだし便利だね。ヘッダってこういうもんでしょ?■『大規模C++ソフトウェアデザイン』を参考図書に挙げた回答は正しい。これで依存性というものを2種類認識することができる。他に必要な知識は、コンパイルという行程の正しい理解(何が含まれ何が含まれないか)とそれに際してコンパイラが必要とする情報について。■.hと .cppの行き来が面倒というのならできるだけ早くモジュール外部に向けた仕様を固めることだ。それがつまりヘッダに書くべき中身であるので、.hの変更が早々に必要なくなる。そのあとで宣言に対応した定義の追加を .cppでする。必要なら不適切な依存関係(循環とか)に注意しながら他モジュールのヘッダを取り込んだり、staticを付けたファイルスコープの関数を補助に使ったりする(これらも .cppの中の話)。モジュール内部でだけ通用する新しいクラスを .cppで定義してもいい。pimplクラスがその典型。■ヘッダに書かなければいけないものはないし、書くと問題がある(が、構成によっては顕在化しない)ものがあるし、書く必要がない(=書くべきではないが書くことができる)ものがある。すべて把握した上で目的を持ってヘッダを書かなくてはいけない。■C++の思想が見えてこないという追記があったが、これに対しては『C++の設計と進化』通称D&E本が最適だし、他に候補を知らない。■SQLiteが amalgamationという名前のもとにすべてをくっつけた 1ソースファイル版をダウンロード可能にしてる。これって VC++のリンク時コード生成オプションと同じ効果を期待した手法なんだと思ってるけど、実際のところどうなんだろ。ページがあった>The SQLite Amalgamation。機械生成コードのための補助ツールが不要だとか、ポータブルで組み込みやすいとかの利点もあるとか。