このシステムを設計する必要があります。
調整されなければならないさまざまな側面があります。
- 関数ポインタを変更する方法がなければならないが。
- コードは、ポインタを介して関数を呼び出さなければなりません。
詳細には複数の方法がありますが、最終的にはテーマにバリエーションがあります。あなたはfilename_func_1_1()
とfilename_func_1_2()
の両方が同じファイルで宣言されていませんかもしれません
/* Declaration of function pointer used to invoke the function */
extern int (*filename_func_ptr)(int arg1, char const *arg2);
/* Two versions of the function */
extern int filename_func_1_1(int arg1, char const *arg2);
extern int filename_func_1_2(int arg1, char const *arg2);
/* Definition of function pointer - pointing to version 1.1 of the function */
int (*filename_func_ptr)(int arg1, char const *arg2) = filename_func_1_1;
/* Use of function pointer */
static void some_function(void)
{
printf("%d\n", (*filename_func_ptr)(1, "pi"));
}
注意。私が描いている効果は「まるで」のようです。あなたは、これが書かれていたかのように
あなたが選ぶあらゆる手段によって、パッチ適用後、結果は次のとおりです。
int (*filename_func_ptr)(int arg1, char const *arg2) = filename_func_1_2;
あなたは、新しいシンボルを取得するために動的ローディング(dlsym()
、プラスdlopen()
など)の問題に得ることができます。ライブラリを動的にロードするためのファイル名と、関数名を正しい関数へのポインタに変換する方法が必要です。
各パッチ可能な関数は、ポインタを通じて一様に呼び出す必要があります。これにより、関数を置き換えることができます。ダイナミック(共有)ライブラリで十分であるかどうかを検討してください(おそらくもっと簡単なので)。ファームウェアを使用している場合、おそらくその贅沢はありません。
多様なインターフェイスを持つ複数の機能をどのように処理するかを検討する必要があります。ここに示すような単一のグローバル変数、または各呼び出しで適切にキャストされなければならないいくつかのジェネリック関数のポインタ型、またはユニオン型、またはポインタを保持する構造体を使用しますか?物事を整理する方法はたくさんあります。
なぜですか?どのような問題を解決しようとしていますか? –
関数ポインタの実用化と効率的な使用を私が念頭に置いています。 – Raulp