• ベストアンサー

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

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

  • 複数ファイルによる共通の外部変数定義について

    初歩的な質問なのですが、今各関数をファイルごとに分けて記述しようとしています。 ここで詰まっているのでできればご教授お願いします ファイル構成は プログラムファイル main.cpp sub.cpp ヘッダーファイル  myheader.h(main.cppとsub.cpp両方でインクルード) ヘッダーファイルには両方のプログラムファイルで使う変数が定義してあります。 それでmain.cppとsub.cpp両方で同じ変数を使いたいのですがコンパイルエラーが発生してしまいます。 内容はsub.obj側で「i(共通のループカウンタ)はmain.objですでに定義されています」というものです。 とにかく私のやりたいことはヘッダーに外部変数を定義して両方のプログラムファイルで使いたいというものです。 もしかしたらファイルを分けるにも何か設定が必要なのでしょうか? 私はただ[プロジェクト]→[プロジェクトに追加]→[新規作成]でソースファイルを作っているだけなんですが・・・ 上記の状態を回避する方法はあるのでしょうか?

  • 複数ファイルから同じ関数の呼び出しできますか?

    今、クライアント・サーバーのプログラムを作っているのですが、クライアントとサーバの間の通信を暗号化しようとしています。 開発環境はVisualStudio2010のMFCを使っています。 サーバとクライアントのプログラムとを同一のプロジェクトにして、サーバとクライアントの起動をオプションで切り分けています。 しかし暗号モジュールは一つのファイルなので、これをp1.cppとしましょう。 サーバのファイルをmain.cpp クライアントをsub.cpp として、main.cppの方で#include "p1.cpp"とやっても、クライアントのソースからは関数が参照できません。 例えば g++ main.cpp sub.cpp として、両方に同じ関数を書くと2重定義になります。 クライアントのsub.cpp にも同じようにインクルードしてやると、再定義されてるとリンクエラーが出ます。どうすれば同じ関数を同一プロジェクト内で共有(他のファイルから参照)させることができますでしょうか? 解決法をよろしくお願いします。

  • ビルドから除外されたソースのコンパイル

    現在、Visual Studioを使用してある巨大なプロジェクトを開発しています。言語は C++です。 このプロジェクトには、ソースファイル(*.cpp)が全部で1000以上もありま す。百ではありません、千です。 そのため、プロジェクトをビルドするのに30分以上もかかり、開発効率が非常に悪 くなっています。 コンパイル・リンクとも相当の時間がかかっています。実感としては、cpp1ファイ ルにつきコンパイル1秒かかっています。 (なぜそんなに大量のcppが必要なのかというのはここでは置いといてください) そこで、次のような方法でビルド時間を短縮する方法を考案しました。 (1)ある一定数のソースファイルのプロパティで「ビルドから除外」とする。 (2) (1)でビルドから除外したソースファイルを全てインクルードしたソース ファイルを作成し、プロジェクトに追加する。 [1つにまとめたソースファイルのイメージ] #include "src001.cpp" #include "src002.cpp" #include "src003.cpp" ・・・ #include "src999.cpp" ソースファイルを1つにまとめてしまう事による弊害は全て解決したものとします。 以上により、プロジェクト内のソースファイル数を100以下にまで減らし、無事ビ ルド時間が大幅に短縮されました。 と、ここまでは良かったのですが、一つ問題があります。 それは、「ビルドから除外」したソースファイルを単独でコンパイル出来なくなって しまうのです。(ここでは、そういうことをしたいという要望があると思ってくださ い) ソリューションエクスプローラでソースファイルを右クリックし、出てくるメニュー リストの「コンパイル」が無効表示され選択できません。 もちろん、コンパイルコマンド(cl.exe)をコマンドラインから直接叩いてやればい くらでも出来ますが、出来ればIDEから簡単な操作で行いたいのです。 また、チームで開発しているため、コンパイルする時だけソースファイルの設定を変 更するというようなことはしたくないのです。 この問題に対して、何か良い手段はないでしょうか? プロジェクトを複数モジュールに分離して・・・ とか、 プリコンパイル済みヘッダを利用して・・・ とか、 リビルド時間を短縮するためソース間の依存関係を減らして・・・ というような、質問の内容を超える回答はご遠慮ください。 そのようなことは、十分ではないかも知れませんが検討済みです。

  • 【VS2008 C++】2つのプロジェクト間で共通の関数を使いたい

    【VS2008 C++】2つのプロジェクト間で共通の関数を使いたい WindowsXP上で visual studio 2008 C++ express editionを 使用しています。 1つのソリューションに2つのプロジェクトをつくり、 その2つに共通の関数を使用させたいのですが、どのように 設定すればよいか教えて頂けませんでしょうか。 ソースの内容は以下のとおりです。 具体的には、mainB.cppでcommon.cppの関数を 呼び出したいです。 //common.cpp #include <stdio.h> void showCommon(){ printf("---common-----\n"); } //common.h #include<stdio.h> void showCommon(); //mainA.cpp #include<stdio.h> #include "common.h" void main(){ printf("---mainA-----\n"); showCommon(); } //mainB.cpp #include<stdio.h> #include "common.h" void main(){ printf("---mainB-----\n"); showCommon(); }

  • C++ Builderでユニットの追加

    趣味でプログラミングを行ってますCerapodaと申します。 Builderを使って1つのFormと1つのCpp,hファイルを使ったプログラミングならある程度のところまで出来ると思っているのですが 以前違うプロジェクトで作った関数を新たなプロジェクトで使おうとして いちいちコピー&ペーストするのも大変なので ひとつのユニット&ヘッダーファイルとしてインクルードして使いたいなと思いました。 そこで http://www.osakac.ac.jp/labs/matsuura/japanese/program/C++Builder/Project/projectManyForm.htm このページを参考にしてUnit1とUni2を作成し Unit2に double Analysis::Function(double val) { return(1.0-val); } の関数を追記。 Unit1のcppに C.Function(0.5); と書き加えたのですが [リンカ エラー] 外部シンボル '_C' が未解決… とエラーが表示されてしまいます。 どこに問題があるのか教えていただければ幸いです。 情報が足りない場合は、補足しますのでよろしくお願いします。 また、このような作業で参考になるサイト,URL等ありましたら教えていただけると幸いです。 よろしくお願いします。

  • ソースファイルの分割について

    a.h クラスの定義 a.cpp クラスのメンバ関数の定義 b.h #include "a.h" クラスの定義 b.cpp クラスのメンバ関数の定義 ----c.cpp---- #include "a.h" #include "b.h" a.hで定義したクラスの宣言 b.hで定義したクラスの宣言 メインの処理 ----------------------------------------- b.cppで定義しているクラスのメンバ関数にて a.cppで定義したクラスのメンバ変数にアクセスしたいのです。 どうするのが一番良いのでしょうか? a.cppにメンバ変数を返すだけの関数を定義してb.cppでc.cppで宣言したa.hのクラスを extern宣言してみたのですがエラーが出てコンパイルが通らないです。

  • C/C++ Win32 プロジェクト で簡単なゲームを作って言います。

    C/C++ Win32 プロジェクト で簡単なゲームを作って言います。 ・.cppファイルはひとつです。 ・#include "DxLib.h" DXライブラリを使用させていただいてます。 プログラムが完成したら.cppファイルをMicrosoft VisualC++ 2010 のメニューバーの 「ファイル」→名前をつけて保存で.exeファイルで保存をして、exeファイルを起動させたのですが、 なにやら、英語でなんか出てきて起動できません。 どうやったら機動できるのでしょうか??? できれば、すぐに答えがほしいです。

  • 構造体と構造体型の変数宣言箇所

    はじめてborlandC++builder6でプログラムを作っているのですが、構造体と構造体型の変数宣言箇所についてわからないことがあるので質問させてください。 あるフォームのソースファイル(○○○.cpp)内の関数で、自分で定義した構造体を使う場合、ヘッダファイル(○○○.h)に構造体を定義すると、関数内で「変数が未定義」エラーになってしまいます。一方、ソースファイル(○○○.cpp)の先頭に書けばエラーになりません。  ヘッダファイルに変数定義した場合とソース内の先頭に構造体と構造体型変数を定義するのでは何が違ってくるのでしょうか?

  • 【VC++2008】2つのmain()を1つのプロジェクトに含める方法

    【VC++2008】2つのmain()を1つのプロジェクトに含める方法 現在、WinXP proで、VC++2008 Express Editionを使用しています。 1つのプロジェクトでmain()がある2つのソースを 使い分けたいのですが、その方法を教えて頂けませんでしょうか。 (うろ覚えですが、VC++6.0の頃にはできたと思います。) 例えば、以下のような2つのソースを含んだ1つのプロジェクトの 設定方法を教えて頂きたくお願いします。 ※ソースを見やすくするため、全角スペースを入れています。 //ソース名:main01st.cpp #include<stdio.h> void main(){   printf("main01\n");  } } //ソース名:main02nd.cpp #include<stdio.h> void main(){   printf("main02\n");  } }

  • C++ visualstudio グローバル変数

    C++のプログラミングに関する質問です。 visual studio2008を使用しています。 手元に非常に複雑なC++ファイルなどから構成されている1つのprojectがあります。(ヘッダファイルなどもあります) そのため、このprojectをデバッグすると、A.cppファイルをデバッグ→B.cppファイルをデバッグ→A.cppファイルをデバッグ→C.cppファイルをデバッグのように、色々なcppファイルを跨ってデバッグします。 1つのcppファイルには大量の関数があり、cppファイルの先頭や,関数外の部分に例えばA.cppで int test などと宣言すれば、A.cppファイル内ではtestと名付けた変数をすべての関数で使えます。 しかし、あくまでA.cppファイル内だけで使用できるだけで、別のBやC.cpp内で使うことはできません。 このtest変数をB.cppやC.cppファイルでも使えるようにするにはどうすればいいでしょうか? 上で挙げた例でいうなら、A.cppからB.cppファイルに移動する際の関数の引数として渡す方法は考えられますが、実際には、 test変数を使いたいのはかなり後に登場するcppファイルで関数の引数として扱うのは非常に大変です。 (Z.cppでtest変数を使いたい。しかしZ.cppに到達するまでにはA~Y.cppを通り、その間に登場するすべての関数でtestを引数にしなければならない) 関数の引数でtest変数を使えるようにする以外の方法がありましたたら教えていただけると幸いです。 実際にやりたいことは A.cpp内にある関数が実行されたらその数をカウントし(A.cppのこの関数は何度も呼び出される関数) //count ++ このcount++の値によってZファイルのある関数での動作を変えたいと思っています。 if(count<100){ printf("aaa"); } しかし、現状ではZ.cppファイル内ではcountが定義されていないので上のようなif文を書くとエラーになってしまいます。

専門家に質問してみよう