- ベストアンサー
Cの関数をC++とCのどちらからでも呼べるようにするには?
お世話になります。 環境はVC6.0となります。 C++で作成したプログラムから、Cで作成したDLLを呼び出す場合、DLL側のプロトタイプ宣言に「extern "C"」を付加する必要があると認識していますが、 呼び出し側がC++かC言語が分からない場合、Cで作成するDLLにはどのように記述するのが一般的(標準的)でしょうか? ちなみに調べてみたところ、 以下のように、「__cplusplus」でくくる方法もあるようですが、C++の標準仕様ではないとの記載がありました。 #ifdef __cplusplus extern "C" { #endif int function(int num); int function2(int num); int function3(int num); #ifdef __cplusplus } #endif よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
DLLプロジェクトに*.defファイルを追加し、 その内容にエクスポート関数名を指定するのが、 最も簡単で、一般的です。 ====MyDll.def=== LIBRARY MyDll EXPORTS function @1 function2 @2 function3 @3 ================ MyDll.lib(エクスポートライブラリ)をリンクす場合は インポート用ヘッダーでのプロトタイプ宣言を __declspec( dllimport)で修飾します。 実際にやってみて、細かい点を確認してみてください。
その他の回答 (1)
- jacta
- ベストアンサー率26% (845/3158)
> 以下のように、「__cplusplus」でくくる方法もあるようですが、C++の標準仕様ではないとの記載がありました。 __cplusplusマクロはC++の標準仕様です。
お礼
ご回答ありがとうございます。 > __cplusplusマクロはC++の標準仕様です。 そのようですね。どこかのHPに書いていたのを鵜呑みにしていました。。。 今ひとつハッキリしないのですが、 MSDNに下記のサンプルがあり、「C で記述された DLL 内の関数に C/C++ 言語のモジュールからアクセスするには、__cplusplus プリプロセッサ マクロを使う」と明記されているのですが、 #ifdef __cplusplus extern "C" { // only need to export C interface if // used by C++ source code #endif __declspec( dllimport ) void MyCFunc(); __declspec( dllimport ) void AnotherCFunc(); #ifdef __cplusplus } #endif 試してみたところ、No.1さんの回答のとおり「__declspec( dllimport )」をC++の呼び出し側に取り込むだけで「extern "C"」を記述しなくても動作しました。 import / export と C++ / C は話がズレているかもしれませんが。。。
お礼
ご回答ありがとうございました。 実はDEFファイルを使用してエクスポートはしていましたが、 C++の呼び出し側プログラムで「__declspec( dllimport) 」は使用することは知りませんでした。。。 結局、DEFファイルはそのままに、DLLのヘッダファイルにあるプロトタイプ宣言を以下の記述をしました。 #ifndef _EXPORTING //呼び出し側の宣言 __declspec(dllexport) int func1(); #else //DLL側の宣言 int func1(); #endif