ページ 11

分割コンパイルにおける型定義

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の方法しか見つかりませんでしたが。
翻訳単位毎に定義できるので、翻訳単位が増えれば定義可能回数も増えると。
定義が複数あるというのは、なんとなく気持ち悪いですけどね。