- 締切済み
二重定義の回避法
VCで1つのDLL内に2つの関数を持つDLLを作成しています。 簡単に書きますと次のようなコードになっています プログラムA #include "common.c" void abc{ ・・・ } プログラムB #include "common.c" void def{ ・・・ } これでビルドするとコンパイルは通りますが リンクのときに同じ関数名が2つ存在するという旨のエラーになります。 common.cの中にある関数がabeとdefの両方で使われているときだけ発生しますので エラーの原因は明らかなのですが、この回避方法が分かりません。 気休めにプログラムBの#includeを外してみたり(コンパイルエラーになります) common.cに#pragma onceを追記してみましたがダメでした。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- rentahero
- ベストアンサー率53% (182/342)
#2の回答に横から補足 なんとなくグローバル変数もあるような気がする 関数をstaticにする(内部結合にする)場合、変数も共有したくないハズなので、グローバル変数もstaticにして(ファイルグローバル変数にして)ください。
- jacta
- ベストアンサー率26% (845/3158)
既に回答にあるように、プロトタイプだけを切り出したヘッダを用意するのが正攻法です。 他の方法としては、 ・関数にstaticを付けて内部結合にする。 ・マクロにする。 ・インライン関数にする。(Cの場合は移植性がなくなる) ・テンプレートにする。(C++のみ) ・無名名前空間を使う。(C++のみ) といった方法があります。 どうしても関数の実体が2つ必要な場合は、staticを付けるか無名名前空間にするのが一番無難です。
- sha-girl
- ベストアンサー率52% (430/816)
common.hの内容 #pragma once void funccommon(); common.cの内容 void funccommon(){ printf("test"); } プログラムA a.cの内容 #include "common.h" void abc{ ・・・ } プログラムB b.cの内容 #include "common.h" void def{ ・・・ } としてください。
お礼
sha-girlさん、画像処理のときはお世話になりました。 問題はcommon.cをincludeするのではなく、 common.cをコンパイルして1つのobjとすることで解決しました。 (それ以外にもう一点クリアする問題があって大変でした) その過程でsha-gielさんの勧告に従いまして ヘッダーファイルに型宣言をすることに致しました。 どうもありがとうございました。
お礼
色々と方法論を挙げて頂き、感謝します。 今回は共通で使う関数の実体は1つにしたいけれど、 EXPORTする関数が2つある場合にどうしたらよいのかでした。 #1に具体的な解決策を書いておきました。