prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 1.22

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。)


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管