次の行に沿って、関数ポインターの配列に割り当てられる一連の C 関数があります。
typedef int (*func)(int);
int SomeLongName1(int a) {
// ...
}
// ...
int SomeLongName1000(int a) {
// ...
}
func f[] = { SomeLongName1, ... , SomeLongName1000 };
これを作成するには多くの作業が必要であり、エラーが発生しやすくなります。たとえば、関数名にタイプミスがある可能性があります。たとえば、有効な関数には名前が付けられているのに、間違った名前が付けられている可能性があります。または、新しい関数が最後に追加された場合、関数ポインターのリストにも明示的に追加するのを忘れる可能性があります。
関数ポインターの配列を明示的に宣言する必要がないように、マクロなどのさまざまなトリックを試しましたが、コードがわかりにくく、マクロのしくみを知る必要がありましたが、一般的には満足していません。
私がやりたいことは次のようなものです:
typedef int (*func)(int);
func f[] = {
int SomeLongName1(int a) {
// ...
}
// ...
int SomeLongName1000(int a) {
// ...
}
};
このようにして、配列は自動的に作成され、最後に null ポインターを置く方法があれば、関数ポインターがいくつあるかを判断できます。
ただし、上記は有効な C ではなく、これを達成する方法は何もありません。コンパイラ固有のもの (GCC 拡張機能など) であれば問題ありません。
すべての関数はコンパイル時に静的に認識されるため、関数ポインター配列の実行時の初期化を行う必要がないようにしたいと思います-そのようにする方法を見つけたわけではありません。
この関連する質問How to define an array of functionsは、同じ質問をしているようですが、論理的な結論には至りません。具体的には、時間を節約し、エラーを回避するために、既に入力したものを再入力する必要はありません。