• 締切済み

二重定義の回避法

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を追記してみましたがダメでした。

みんなの回答

  • rentahero
  • ベストアンサー率53% (182/342)
回答No.3

#2の回答に横から補足 なんとなくグローバル変数もあるような気がする 関数をstaticにする(内部結合にする)場合、変数も共有したくないハズなので、グローバル変数もstaticにして(ファイルグローバル変数にして)ください。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

既に回答にあるように、プロトタイプだけを切り出したヘッダを用意するのが正攻法です。 他の方法としては、 ・関数にstaticを付けて内部結合にする。 ・マクロにする。 ・インライン関数にする。(Cの場合は移植性がなくなる) ・テンプレートにする。(C++のみ) ・無名名前空間を使う。(C++のみ) といった方法があります。 どうしても関数の実体が2つ必要な場合は、staticを付けるか無名名前空間にするのが一番無難です。

hawkwind
質問者

お礼

色々と方法論を挙げて頂き、感謝します。 今回は共通で使う関数の実体は1つにしたいけれど、 EXPORTする関数が2つある場合にどうしたらよいのかでした。 #1に具体的な解決策を書いておきました。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

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{ ・・・ } としてください。

hawkwind
質問者

お礼

sha-girlさん、画像処理のときはお世話になりました。 問題はcommon.cをincludeするのではなく、 common.cをコンパイルして1つのobjとすることで解決しました。 (それ以外にもう一点クリアする問題があって大変でした) その過程でsha-gielさんの勧告に従いまして ヘッダーファイルに型宣言をすることに致しました。 どうもありがとうございました。

関連するQ&A