Q我如何声明一个可以返回同一类型函数指针的函数?我正在构建一个状态机,每个状态有一个函数,每个函数都返回指向下一个状态的函数的指针。但我找不到声明函数的方法——我似乎需要一个返回指向一个返回指向一个返回...无限循环的函数的函数的函数。
A你无法直接做到。一种方法是让函数返回一个通用的函数指针(参见问题 4.13),并进行一些审慎的类型转换来调整指针在传递过程中的类型。
typedef int (*funcptr)(); /* generic function pointer */ typedef funcptr (*ptrfuncptr)(); /* ptr to fcn returning g.f.p. */ funcptr start(), stop(); funcptr state1(), state2(), state3(); void statemachine() { ptrfuncptr state = start; while(state != stop) state = (ptrfuncptr)(*state)(); } funcptr start() { return (funcptr)state1; }(第二个ptrfuncptrtypedef 隐藏了一些特别晦涩的语法;没有它,state变量需要声明为funcptr (*state)()并且调用将包含形式令人费解的类型转换(funcptr (*)())(*state)().)
另一种方法(由 Paul Eggert、Eugene Ressler、Chris Volpe 等人提出)是让每个函数返回一个只包含指向返回该结构的函数的指针的结构。
struct functhunk { struct functhunk (*func)(); }; struct functhunk start(), stop(); struct functhunk state1(), state2(), state3(); void statemachine() { struct functhunk state = {start}; while(state.func != stop) state = (*state.func)(); } struct functhunk start() { struct functhunk ret; ret.func = state1; return ret; }(请注意,这些示例使用了通过函数指针进行调用的较旧的显式样式;请参见问题 4.12。另请参见问题 1.17。)