ページ 1 / 1
分割コンパイルにおける型定義
Posted: 2008年1月08日(火) 22:27
by ibis
定義というより宣言の話ですが。
他の翻訳単位に定義がある場合のclassやstructの宣言はどうすればよいですか。
Re:分割コンパイルにおける型定義
Posted: 2008年1月08日(火) 23:44
by たかぎ
質問の意図を確認させてください。
クラスの宣言というのは、
class A;
です。
それに対して、クラスの定義は、
class A
{
public:
void func();
};
です。
宣言であれば、前述以外の書き方はできないのですが、そういうことでよろしいでしょうか?
Re:分割コンパイルにおける型定義
Posted: 2008年1月11日(金) 22:30
by ibis
お返事遅くなり申し訳ございません。
質問の内容ですが、もう少し具体的に言うと、
例えばa.cppというファイルでクラスを定義して
b.cppというファイルでそのクラスを使う場合に、
b.cppでクラスを宣言していてもエラーがでますよね。
例えばbccでは以下のエラーが。
・未定義の構造体
・サイズが不明、あるいはゼロ
この対処はどうすれば良いのか、ということです。
関数や変数ならexternキーワードが使えますが、
クラスの宣言には使えないようですし。
Re:分割コンパイルにおける型定義
Posted: 2008年1月11日(金) 23:19
by Ban
1. classをヘッダで定義し、両方のcppから#includeする。
2. b.cppでa.cppを#includeする。
そして必要なら、a.cpp自体はコンパイルしない、
#ifdefマクロで切り替えるなど、の対策を追加。
3.そのクラスはポインタ(ハンドル)としてしか使わない。
> でそのクラスを使う場合に、
# C/C++のFILE*みたいな使い方。
classの宣言についてはたかきさんの書かれている通りで、
本当に"宣言"しかなくて、classの定義が必要な使い方をする限り、
そうするしかない。
Re:分割コンパイルにおける型定義
Posted: 2008年1月12日(土) 00:09
by ibis
回答ありがとうございます。
先程の投稿の後、自分でももう一度調べてみました。
まぁBanさんの挙げた中では1の方法しか見つかりませんでしたが。
翻訳単位毎に定義できるので、翻訳単位が増えれば定義可能回数も増えると。
定義が複数あるというのは、なんとなく気持ち悪いですけどね。