OS:WinNT4.0
環境:VC++6.0 MFC
コンパイル時に次のエラーが出て来ました。
error C2664: 'qsort' : 4 番目の引数を 'int (const void *,const void *)' から 'int (__cdecl *)(const void *,const void *)' に変換できません。 (新しい機能 ; ヘルプを参照)スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。
qsort関数の引数関数を'int xxxxxxx(const void *,const void *)に宣言したところこのエラーが出てきました。
何がなんだかさっぱりわかりません。
ぜひお願いします。
No.1
- 回答日時:
こんにちは。
エラーメッセージ内に (__cdecl *) がありますよね。
これは関数の呼び出し規約が __cdecl ですよーと言う意味です。
VC++6.0 でプロジェクトを作るとデフォルトの呼び出し規約が
__cdecl になっていて問題なくビルドが通ると思いますが、
呼び出し規約を変えませんでした?
呼び出し規約の変更はメニューから、
プロジェクト(P)→設定(S)→C/C++タブ→カテゴリ[コード生成]
にあります。
確認してみて下さい。
No.2
- 回答日時:
こんにちは。
itohhといいます。qsort関数は、メンバ関数として定義しては行けません。
静的関数として定義しましょう。
例.
void CTest::m_qsort()
{
qsort(buf, num, len, ::xxxxxx );
}
static int __cdecl xxxxxx(LPCVOID a, LPCVOID b)
{
}
No.3ベストアンサー
- 回答日時:
まず、CとC++では動作のメカニズムが異なるため、Cでコンパイルされた関数をC++から呼び出す場合には、その旨をC++コンパイラに指示する必要があります。
qsort関数はCのライブラリ関数であり、qsortが内部から呼び出す比較関数もCでコンパイルされたものでなければなりません。
ところが比較関数はC++ソース内に記述され、C++としてコンパイルされるため、qsortからは呼び出せないというエラーが出ているのです。
一体何がそんなに違うのかというと、内部的な関数名や、引数の処理の仕方(スタックのクリア方法)などが大きく異なるのです。これを指定するのが「関数呼び出し規約」と言われるものです。ちなみにCにはありません。
C++内でのCの呼び出し規約は「__cdecl(C default callの略)」というキーワードで表されます。異なる呼び出し規約への変換は出来ないため、質問のようなエラーが出たのでしょうね。
確かに比較関数に__cdeclをつけて宣言すれば直ると思いますが、普通は「リンケージ指定」を使って、
extern "C" int comp(const void *a, const void *b);
extern "C"
{
int comp(const void *a, const void *b)
{
// コード
}
}
のように書いて、そこだけCとしてコンパイルします。
また比較関数に関するコードだけ、.cのファイルに記述しても同様の効果があります。
__cdeclなどは推奨されたキーワードではないため、自分ではなるべく使わない方が良いでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C pointer? or... 2 2022/03/29 00:47
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
戻り値を返す関数の前に(void)...
-
C++にてtemplateで受け取った任...
-
【gcc・cygwin】multiple defin...
-
Notepad++の関数リスト表示の変...
-
int main()、void main()、void...
-
C# KeyDownイベントでショート...
-
ArduinoでMouse関数を使用して...
-
ドラッグしたときにマウスカー...
-
多重定義が起きている?--lnk20...
-
合格か否かを表示するプログラ...
-
typedef unsigned int UINT;が...
-
構造体を宣言と共に初期化する方法
-
C++別のオブジェクトからメンバ...
-
VC++でGetKeyboardStateがうま...
-
C# Controls.Addで動的に配置し...
-
C#でラジオボタンを設定に記録...
-
void*型の配列について
-
gcc: incompatible pointer type
-
マルチメディアタイマーの使用方法
-
DLLの関数呼び出しで引数がある...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
int main()、void main()、void...
-
戻り値を返す関数の前に(void)...
-
既定のコンストラクタがありま...
-
Notepad++の関数リスト表示の変...
-
ArduinoでMouse関数を使用して...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
静的でないメンバ関数の呼び出...
-
C# Controls.Addで動的に配置し...
-
const_castのつかいどころを教...
-
(void)0 はどんな意味ですか
-
C# KeyDownイベントでショート...
-
gcc: incompatible pointer type
-
C#でラジオボタンを設定に記録...
-
VC++でGetKeyboardStateがうま...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
void*型の配列について
-
GDI+の使用方法について
-
DirectInput でのエラー
おすすめ情報