私は戻って、このような別の関数の呼び出しで別の関数ポインタを埋め込むされた関数呼び出しを知っている:Cでは、なぜ関数ポインタが関数呼び出しの方が適しているのですか?
関数の宣言:
function_call_back(int x, int y, void (*functonPtr)(int x, char y , struct newStruct* sptr))
void func(int x , char y , struct newStruct* sptr1)
{
//perform Algorithm 1 on x,y ,sptr1
}
void func2(int x , char y , struct newStruct* sptr2)
{
//perform Algorithm 1 on x,y ,sptr2
}
void func3(int x , char y , struct newStruct* sptr3)
{
//perform Algorithm 1 on x,y ,sptr3
}
void func4(int x , char y , struct newStruct* sptr4)
{
//perform Algorithm 1 on x,y ,sptr4
}
main()
{
// function calling
function_call_back(23, 2256, func1);
}
関数名と等価であるとして、ここでは3番目の引数が、func
です関数ポインタ
ここでfunc
は、類似の関数シグネチャの異なるバリエーションで、この行をメインのabに追加することで変更できますfunction_call_backへの呼び出しの前にOVEを:関数名があるよう
typedef void (*fptr)(int int x , char y , struct newStruct* ptr);
fptr f1 = func2; // or func3, or func4
function_call_back(23, 2256, f1);
3番目の引数は、func
ですが、私はこれを思っていただけでの呼び出しで関数を呼び出すコードを追加することによって、また、下記の方法で達成することができますfunction_call_back
:
function_call_back(23, 2256, functionCallingcode); //third argument is func
function_call_back
の新しい宣言は次のとおりです。
function_call_back(int x, int y, int functionCallingCode)
とその北東定義は次のとおりです。
void function_call_back(int x, int y, int functionCallingCode)
{
switch(functionCallingCode)
case 1:
func1(1,"g",sptr1);
break;
case 2:
func2(1,"c",sptr2);
break
case 3:
func3(1,"d",sptr3);
break;
case 4 :
func4(1,"s",sptr4);
break ;
default :
printf("Wrong Function calling code");
}
}
なぜ関数ポインタを使用するのですか?
何よりも適していますか?あなたのより良い選択肢は何ですか?このコードは読めない混乱です。 – duffymo
あなたはなぜこのような醜い 'スイッチ'をやろうとしますか? – SLaks
@duffymo非関数ポインタの実装よりも適しています。コードをクリアしてクリーンアップします。 – Raulp