c++ - Pointers to functions / Function Tables -


i learning function pointers , came across following code:

#include <iostream> using namespace std;  // macro 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 key 'a' 'g' "          "or q quit"<< endl;         char c, cr;         cin.get(c); cin.get(cr); // second 1 cr         if ( c == 'q')         break;         if (c < 'a' || c > 'g')         continue;         (*func_table[c-'a'])();     } } 

can please explain me how pointer function func_table works? in particular effect of having a,b,c,d,e,f,g inside {} , whole expression doing?

usually when see pointer function initialize pointer assigning function name, in example provided array of characters. how know call df(char)?

also, not sure why needed have statements:

df(a); df(b); df(c); df(d); df(e); df(f); df(g); 

also, statement: (*func_table[c-'a'])(); reason why subtracting 'a' because different determine correct letter choose array {a,b,c,d,e,f,g}?

that ugly, obfuscated code, it's not shame confuses you. let's piece piece:

// macro define dummy functions: #define df(n) void n() { \     cout << "function " #n " called ... " << endl; }  df(a);  

if expand macro invocation, get:

void a() {      cout << "function called ... " << endl; } 

and similar b, c , on. a through g functions printing own name, nothing more.

void (*func_table[])() = {a, b, c, d, e, f, g};  

that's easier read typedef:

typedef void (*funcptr)(); //funcptr function pointer functions of type void x(); funcptr func_table[] = {a, b, c, d, e, f, g}; 

and actually, {&a, &b, &c, &d, &e, &f, &g} - author makes use of implicit function-to-function-pointer conversion. meaning: func_table array of function pointers a through g

int main(){     while(1){         cout << "press key 'a' 'g' "          "or q quit"<< endl;         char c, cr;         cin.get(c); cin.get(cr); // second 1 cr         if ( c == 'q')         break;         if (c < 'a' || c > 'g')         continue; 

this should clear. call:

    (*func_table[c-'a'])(); 

c-'a' offset 'a', meaning 0 'a', 1 'b' , on. example, if c 'd', line calls (*func_table['d'-'a'])(), wich *(func_table[3])() wich d - line calls function name typed.


Comments