次のコードは、私がしようとしていることを記述していると思います。具体的には、汎用ポインターの型が異なるだけで、汎用ポインターを汎用ポインターにキャストしたいと思っています。異なるポインタ型の引数ポインタとしてのキャスト関数ポインタ
は今、私はthis questionで説明したように互換を可能にする関数ポインタのための要件があることを認識してんだけど、私は別のポインタ型を満たす互換性要件の引数を持つかどうかはわかりません。
コードはコンパイルされて実行されますが、期待通りに、互換性のないポインタ型からの割り当てに関する警告が表示されます。コンパイラを満足し、私が何を達成するための方法がありますか?
#include <stdio.h>
int float_function(float *array, int length)
{
int i;
for(i=0; i<length; i++){
printf("%f\n", array[i]);
}
}
int double_function(double *array, int length)
{
int i;
for(i=0; i<length; i++){
printf("%f\n", array[i]);
}
}
int main()
{
float a[5] = {0.0, 1.0, 2.0, 3.0, 4.0};
double b[5] = {0.0, 1.0, 2.0, 3.0, 4.0};
int (*generic_function)(void*, int) = NULL;
generic_function = &float_function;
generic_function(a, 5);
generic_function = &double_function;
generic_function(b, 5);
return 0;
}
確かに、私はそれについて考えていました。問題は私がライブラリを呼び出すことである(それ自体が問題のスタック全体を持つかもしれない!)。したがって、私は別々に呼び出すそれぞれの関数をラップする必要があります。これは、私が避けようとしていたものです(内部ロジックを単純にしていますが)。 –
私はライブラリ関数の事例を考えていませんでした。コンパイラと人間の読者の両方を満足させるのは難しいでしょう。たぶん、ラッパー関数(または醜いプリプロセッサハック;-)は正しい方法です。 – wildplasser
私はラッパー関数が最もクリーンな方法であることに同意します。もう少しコードがありますが、論理的に分かれています。また、署名を変更してラッパーにコードを含めることもできます。 –