2017-09-04 4 views
3

TL:DR;私はこのエラーが発生しましたerror: initializing argument 2 of 'int SocketSrv(int, int (*)(), int*, int, int, int)' Cとして使用されていたプロジェクトをコンパイルするときに+ +。このプログラムは、警告なしに(その行にあるとにかく)Cコードとしてコンパイルされます。C - > C++への移行関数へのポインタがコンパイラエラーをスローする

コードは次のとおりです。

rtn=SocketSrv(RxServConfig->port_nbr1, fn, &RxDataSocketId, 
      RxServConfig->max_children, 
      RxServConfig->shmemkey, 
      RxServConfig->semkey); 

問題は、我々はint function()期待する関数に機能int function (int)へのポインタを与えるということです。

これはCで働いていたし、私が呼び出される関数のコードにはアクセスできませんなぜ私もアイデアを持っていません。

質問:私は何とかint (*)()int (*)(int)をキャストすることはできますか?そしてもう一度「なぜこれが今まで働いたの?」実際にパラメータを使用するように指示された関数は、パラメータなしで関数ポインタを宣言しても、Cはパラメータを渡しますか? C IN

答えて

9

int (*)()intを返し、パラメータの不特定多数を取る関数へのポインタを意味し、C++ではそれがintを返し、パラメータを取る関数を意味し、それはCでコンパイル理由ですが、それはC++ではありません。このより多くの情報を解決するために

が必要とされていますが、単に右の署名で関数のオーバーロードを作成し、その中から他を呼び出すことができます。

+0

興味深いは、間違いなく私のより多くの研究の出発点を与えます。それは、関数ポインタに割り当てられたいくつかの異なる関数を呼び出すブロックにあります。すべてが同じシグネチャを持っているかどうかを調べ、ラッパーを記述する必要があります。私はC + +で引数の不特定多数を持つことはできないと思いますか? voidポインタに変更すると変更されますか?あなたが渡されたポインタが正しい型と問題を抱えていることを確認してください@xyiousと呼ばれる機能 – xyious

+0

*未定義の動作*を避けるよう注意してください。 –

+0

の宣言である場合(f)はおそらく、それはあなたが持っている2つのアイデアのいずれかで仕事を働くが、それに覚えることができるreinterpret_castは試すことができます@xyious –

関連する問題