関数ポインターについて学んでいて、次のコードに出くわしました。
#include <iostream>
using namespace std;
// A macro to define dummy functions:
#define DF(N) void N() { \
cout << "function " #N " called ... " << endl; }
DF(a); DF(b); DF(c); DF(d); DF(e); DF(f); DF(g);
void (*func_table[])() = {a, b, c, d, e, f, g};
int main(){
while(1){
cout << "press a key from 'a' to 'g' "
"or q to quit"<< endl;
char c, cr;
cin.get(c); cin.get(cr); // second one for CR
if ( c == 'q')
break;
if (c < 'a' || c > 'g')
continue;
(*func_table[c-'a'])();
}
}
関数 func_table へのポインターがどのように機能するかを誰かに説明してもらえますか? 特に、a、b、c、d、e、f、g を内部に持つことの効果は何であり、{}
その式全体が何をしているのか?
通常、関数へのポインターが表示されると、関数名を割り当ててポインターを初期化しますが、この例では、文字の配列が提供されているだけです。では、DF(char) を呼び出すことはどのようにしてわかるのでしょうか?
また、なぜステートメントが必要なのかわかりません:
DF(a); DF(b); DF(c); DF(d); DF(e); DF(f); DF(g);
また、次のステートメントを使用します(*func_table[c-'a'])();
。「a」を減算する理由は、配列から選択する正しい文字を決定するため{a,b,c,d,e,f,g}
です。