ページ 11

dllの同じ名前の関数を2つ以上宣言する方法について

Posted: 2011年3月19日(土) 05:54
by dic
dllを作成しています
色々関数を作ってます
そこで、たとえば画像の読み込みをする関数を作っているのですが
関数で、ファイル名だけの場合と、ディレクトリ+ファイル名というふたつ用意したいです
そこで、下のように宣言したところ

コード:

#define EXPORT extern "C" __declspec(dllexport) 
//	ビットマップ、描画 関連
EXPORT	IMAGE	DxDraw_LoadBitmap( char *filename );
EXPORT	IMAGE	DxDraw_LoadBitmap( char *directory, char *filename );
dxdraw3.h(45) : error C2733: オーバーロードされた関数 'DxDraw_LoadBitmap' の C リンケージの 2 回以上の宣言は許されません。
とコンパイルエラーがでました
C/C++のdllでは同じ名前の違う引数をもつ関数を持つことはできるのでしょうか?
できたらその方法も教えてくれると助かります

(質問書いてて思ったのですが、extern "C" ってあるので、C/C++言語ではなく C言語になるのでしょうか?)

環境:Visual C++ 6.0
OS:WindowsXP
dllを利用する実行ファイルもWindowsXP

Re: dllの同じ名前の関数を2つ以上宣言する方法について

Posted: 2011年3月19日(土) 06:38
by あたっしゅ
関数のオーバーロードは、C++ で拡張された機能です。C だとエラーです。

C++ コンパイラは

func() という関数なら func@@V、
func( char* p ) という関数なら func@@CP、
func( int i, char* p ) という関数なら func@@ICP

という感じで関数名を変形させ、区別します。変形後の関数名は例です。
変形のさせかたは、コンパイラによって異なります。

extern "C" の "C" は、C の流儀の名前で、という意味で、
C で書かれたものを C++ から呼び出すためにあります。

>C/C++のdllでは同じ名前の違う引数をもつ関数を持つことはできるのでしょうか?

C では同じ名前の違う引数をもつ関数を持つことはできません。
C++ では同じ名前の違う引数をもつ関数を持つことはできます。
extern "C" ではなく、extern をつかえばいいんじゃないかな ? ためしてないけど。

Re: dllの同じ名前の関数を2つ以上宣言する方法について

Posted: 2011年3月19日(土) 07:06
by dic
>>あたっしゅさん
C言語を勉強したのがそうとう昔だったんで、同じ名前が使えるオーバーロードに関してあいまいでした

コード:

#define EXPORT extern "C" __declspec(dllexport) 
を

コード:

#define EXPORT extern  __declspec(dllexport) 
に変更してコンパイルできました
また、できあがったdll,libファイルを使用して、その関数を利用することもできました

ありがとうございました