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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

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

#1

投稿記事 by dic » 14年前

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

アバター
あたっしゅ
記事: 667
登録日時: 14年前
住所: 東京23区
連絡を取る:

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

#2

投稿記事 by あたっしゅ » 14年前

関数のオーバーロードは、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 をつかえばいいんじゃないかな ? ためしてないけど。
VTuber:
[香車]東上☆Aho(暎帆)☆海美
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

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

#3

投稿記事 by dic » 14年前

>>あたっしゅさん
C言語を勉強したのがそうとう昔だったんで、同じ名前が使えるオーバーロードに関してあいまいでした

コード:

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

コード:

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

ありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る