1

Cコードをに変換しようとしていますC++。私の .c ファイルには、次のような定義があります。

void services(void);
void transfers(void);

さらに、スレッドは上記の 2 つを次のように初期化します。

_beginthread((void*) services,0,NULL);
_beginthread((void*) transfers,0,NULL);

コンパイルしようとすると、上記の両方の場所で次のようなエラーが発生しました。

Conversion from void* to pointer to non-void required an Explicit cast: Cannot convert parameter 1 from void* to void(_cdecl*)(void*)

私はこれについて混乱しています。皆さんが私のために明確にしてくれることを願っています:-)

4

3 に答える 3

3

解決策は、正しいタイプの関数を使用し、それらをキャストしないことです。コードに関連しない場合は、パラメーターを無視します。

void services(void*);
void transfers(void*);

_beginthread(services, 0, NULL);
_beginthread(transfers, 0, NULL);

ソースにアクセスできない場合など、絶対に関数を変更できない場合は、ラッパーを使用します。

void correct_services(void*) { services(); }
_beginthread(correct_services, 0, NULL);

ここではコンパイラが役に立ちます - 嘘をついて回避しようとしないでください。

于 2013-09-06T11:29:04.060 に答える
1

C++ 呼び出し標準から C 呼び出し標準に変換しようとしているようです。cdecl は C 宣言の略です。関数を cdecl に手動で定義するには、使用できますvoid _cdecl funct();

于 2013-09-06T11:15:55.890 に答える
0

試す:

_beginthread((void(_cdecl*)(void*)) services, 0, NULL);

あなたがしていたことは、関数ポインタを非関数ポインタ型 ( void *) に明示的にキャストすることでした。これでOKでした。ただし、_beginthread関数は、最初のパラメーターとして、エラー メッセージに記載されている正しい型の関数ポインターを想定しています。したがって、キャストを修正する必要があります。


この回答に反対票を投じようとしている場合は、その理由を教えていただければ幸いです。user2754070 が のプロトタイプを変更したい場合は、はるかに良いとservices思います (以下の私のコメントを参照してください)。ただし、私が提案していることは機能し (答えは受け入れられました)、私の知る限り、スレッドを生成する C ライブラリでは安全で標準的な方法です。そうではないと思われる場合は、理由を説明してください。回答を削除することを検討します。

于 2013-09-06T11:14:10.007 に答える