我正在学习有关函数指针和整个下面的代码来:函数指针/函数表
#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}
?
我想我现在明白了。因此宏#define DF(N)void N(){/ ....将创建一个名称为(N)的新函数,所以DF(a)= a()。因为我们将没有参数列表的函数名传递给函数指针,这就是为什么我们有函数{a,b,c,d,e,f,g}的数组,这些函数实际上是{a(),b() ,c(),d(),e(),f(),g()} 感谢您的耐心和乐意解释我真正感激它的代码。 - Marco – SeekingAlpha
不要让任何人抓到你写这样的代码;-) –
实际上,函数指针数组是'{&a,&b,&c,&d,&e,&f,&g}' - 作者利用隐式函数到函数指针的转换。 '{a(),b(),c()}'是一个函数调用结果的数组。 –