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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ibis

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

#1

投稿記事 by ibis » 17年前

定義というより宣言の話ですが。
他の翻訳単位に定義がある場合のclassやstructの宣言はどうすればよいですか。

たかぎ

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

#2

投稿記事 by たかぎ » 17年前

質問の意図を確認させてください。

クラスの宣言というのは、
class A;
です。
それに対して、クラスの定義は、
class A
{
public:
  void func();
};
です。
宣言であれば、前述以外の書き方はできないのですが、そういうことでよろしいでしょうか?

ibis

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

#3

投稿記事 by ibis » 17年前

お返事遅くなり申し訳ございません。

質問の内容ですが、もう少し具体的に言うと、
例えばa.cppというファイルでクラスを定義して
b.cppというファイルでそのクラスを使う場合に、
b.cppでクラスを宣言していてもエラーがでますよね。
例えばbccでは以下のエラーが。
・未定義の構造体
・サイズが不明、あるいはゼロ
この対処はどうすれば良いのか、ということです。
関数や変数ならexternキーワードが使えますが、
クラスの宣言には使えないようですし。

Ban

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

#4

投稿記事 by Ban » 17年前

1. classをヘッダで定義し、両方のcppから#includeする。
2. b.cppでa.cppを#includeする。
 そして必要なら、a.cpp自体はコンパイルしない、
 #ifdefマクロで切り替えるなど、の対策を追加。
3.そのクラスはポインタ(ハンドル)としてしか使わない。
 > でそのクラスを使う場合に、
 # C/C++のFILE*みたいな使い方。

classの宣言についてはたかきさんの書かれている通りで、
本当に"宣言"しかなくて、classの定義が必要な使い方をする限り、
そうするしかない。

ibis

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

#5

投稿記事 by ibis » 17年前

回答ありがとうございます。

先程の投稿の後、自分でももう一度調べてみました。
まぁBanさんの挙げた中では1の方法しか見つかりませんでしたが。
翻訳単位毎に定義できるので、翻訳単位が増えれば定義可能回数も増えると。
定義が複数あるというのは、なんとなく気持ち悪いですけどね。

閉鎖

“C言語何でも質問掲示板” へ戻る