上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- -- l スポンサー広告 l top
今回C++の分割コンパイルについてまとめたいと思います。

本日私は800行を越えるC++のファイルの分割を行ったのですが、いろいろ迷うところがあったのでここにまとめておきたいと思います。

インクルードガードや多重定義、二重インクルード、二重読み込みやvisual studio c++で

既に ○○.obj で定義されています。

と警告が出て困っている人は必見です
そもそも分割コンパイルとは、いくつかのソースファイルに分けてプログラムを記述し、(関数やクラスが大きくなると、クラス単位や関数単位でファイルを作る)コンパイル時にくっつけるという方法である。

基礎的でヘッダー同士がバッティングしない分割コンパイルの例はここが詳しい
Visual C++ではmakeファイルを作る代わりにプロジェクトに読み込ませれば良い。

さて、しかし複雑になれば以下のような問題も起きる。

2重定義って??
分割コンパイルの方法がわかりません‥(Studio.NET)

そこで改めてこれらを考え直してみたい。

分割コンパイルに関して、ヘッダーファイルに書いていいのは

マクロや定数の定義
クラスや構造体の定義
変数の宣言(定義ではない)

の3つである。

マクロや定数の定義はそのままでOK
クラスや構造体の定義はここや、ここここを参考にインクルードガードをかければよい。

変数の宣言はextern 型名 変数名;として、「どこかのこのヘッダファイルを読み込んでいるcppファイルがグローバル変数で宣言しているよ。」って言うのを明示すればよい。

さーうまくいくぞ!!!…と思ったが何度やってもクラス内に記述した関数で引っかかってしまう

ずっと悩んでいたのだがこれを見てふと思った。


もしやインライン展開していないクラス内関数は通常関数と同じ扱いなのでは!?


ということで○○::☆☆という形の、クラス内関数を全てcppファイルにまとめ、自作ヘッダファイルを読み込ませてみた。

すると何の問題もなく通るではないか!?


ということで分割コンパイルは解決したのである。

しかしクラス内に直接インライン展開している関数は引っかからないのに、外部に書いた関数だけ引っかかるってなんか釈然としないなぁ(x_x;)
2008.01.27 Sun l 完全な私事 l コメント (1) トラックバック (0) l top

コメント

No title
ヘッダでメモリ確保アウトだったんですね
リンク先が役立ちました
2010.07.12 Mon l 酢NEO. URL l 編集

コメントの投稿












トラックバック

トラックバック URL
http://omine3.blog119.fc2.com/tb.php/41-be1a0a54
この記事にトラックバックする(FC2ブログユーザー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。