• ベストアンサー

一つのソースユニットを複数のプロジェクトで共有したい

BCB5を使っています。 複数のプログラムで共通な関数について、それらのプログラムで共有できるソースユニットを作ることが出来たら便利だと思っていますが、そんなことは可能でしょうか? 今三つのプログラム(A.exe、B.exe、C.exe)があるとします。 これらのプログラムの一部には、全く同じ処理があります。 それを関数Zf()とします。 で、Z.cppというユニットにこの関数を記述し、三つのプロジェクトで共有するのです。 この関数は仕様が完全に決まってはおらず、試行錯誤しながら決めて行くことになっています。 修正が多発するのですが、Z.cppを一つ修正すれば、再コンパイルだけで反映するので便利だ、という考えです。 私の知識では、一つのプロジェクトに新たなソースユニットを作る場合、そのユニットでは、呼ぶ側のヘッダーをincludeする必要があります。 今回の場合は、Z.cppは三つのプロジェクトに登録するわけですから、三つのヘッダーをincludeすることになってしまいます。 A.hとB.hを見ると同じ名前の変数や関数があり、これを同時にincludeするとマズイ事になりそうな気がします。 呼ぶ側のヘッダーをincludeせずに共有することは可能なのでしょうか? ちなみに関数Zf()では、グローバル変数は使っていませんし、他のユーザ関数を呼ぶこともありません。 シロートの質問ですがよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

ちなみに関数Zf()では、グローバル変数は使っていませんし、他のユーザ関数を呼ぶこともありません。 これならZ.cppでは標準ヘッダ以外に何もincludeする必要はないでしょう A.cpp, B.cpp, C.cppで Z.hをincludeする必要はあると思われますが。

Han1344
質問者

お礼

php504さん、ありがとうございます。 Z.cppでは、 int TForm1::Zf(char *txt){ 略 } と記述しています。 呼ぶ側のヘッダーをincludeしないと、コンパイラーからは「 E2090 型限定子 'TForm1' がクラス名または名前空間名ではない」というエラーが返されます。 そこで、呼ぶ側のヘッダーをincludeしています。 私のソースは何かが違うのですね?

Han1344
質問者

補足

php504さん、ありがとうございました。 落ち着いてもう一度php504さんのコメントを読み直し、いろいろ試してみました。 結果としてphp504さんのおっしゃることが正しい、という結論になりました。 私はかなり誤解をした記述をしていたようです。 私の誤った記述は次のとおりです。 呼ばれるソースでの関数の記述(すでに書いてありますが)は、 int TForm1::Zf(char *txt){ 略 } です。 この関数の宣言は呼ぶ側のソースのヘッダーで行っていました。 呼ばれる側のソースのヘッダーには何も記述されていない状態です。 そこで、呼ばれるソースでは、 int Zf(char *txt){ 略 } とし、そのヘッダーにこの関数を宣言する。 呼ぶソースでは、php504さんのおっしゃる通り呼ばれるソースのヘッダーをincludeする。 これでコンパイルも通り、狙い通りのプログラムにすることが出来ました。  テストとして、別のプログラムを作り、この関数を書いたソースユニットをプロジェクトに追加して試したところ、正常に動きました。 本当にありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

> Z.cppでは、 > int TForm1::Zf(char *txt){ 後だしじゃんけんは止めましょう > ちなみに関数Zf()では、グローバル変数は使っていませんし と書かれていれば 単に int Zf() {   // 何か共有の処理 } と考えるのが一般的かと思います 今回の場合なら z.cppファイルを各プロジェクトに含める方向だと思います クラスメンバーなら a.h, b.h, c.hなどのTFom1のクラス定義でZfを定義すべきでしょう z.cppのなかで a.h, b.h, c.hのどれかをインクリュードしてやれば事足りそうです #ifdef _aProject_ #include "a.h" #endif #ifdef _bProject_ #include "b.h" #endif #ifdef _cProject_ #include "c.h" #endif といった具合でよさそうに思いますが ・・・

Han1344
質問者

お礼

redfox63さん、回答ありがとうございました。 >と書かれていれば 単に >int Zf() { >  // 何か共有の処理 >} >と考えるのが一般的かと思います そうだったんですね。 私は常にint TForm1::Zf(以下略 と記述するもんだと思っていました。 どこかで誤解をしたまま記憶してしまったようです。 最初から、どんなソースを書いていたのか明らかにしておけば良かったですね。 申し訳ありませんでした。 No2.の補足にも書きましたが、関数の宣言を呼ばれる側のヘッダーに記述し、呼ぶ側では呼ばれる側のヘッダーをincludeしたら正常にコンパイルできました。 呼ばれる側では、呼ぶ側のヘッダーはまったくincludeしなくても行けそうです。 私は事務処理のプログラムを書いていまして、数字を3桁のカンマ編集をする、というように頻繁に使う関数があるのですが、今まではそれをソースの中に貼り付けていました。 今回の問題解決により、もっとスッキリと組み込むことが出来そうです。 ありがとうございました。

すると、全ての回答が全文表示されます。
回答No.1

namespace を使えばよいかと思います。名前衝突を回避できます。

すると、全ての回答が全文表示されます。

関連するQ&A