那是满口的。基本上我有这个:
typedef int (*decker_function_t)(int);
decker_function_t decker;
// Some logic making decker point to a real function
int i = decker(5);
return 1;
但是,我真正想要的是decker_function_t
类型的函数返回decker_function_t
类型,而不是int
。我无法弄清楚如何使typedef自我引用。这可能吗?
另请注意我严格要求C,而不是C ++,
答案 0 :(得分:3)
无法直接申报。语法语法没有提供破解本声明中固有存在的无限声明性递归的机会,这很遗憾,因为它没有物理递归。
解决方法包括
对返回类型使用“generic”函数指针类型void (*)(void)
。当然,您必须将返回的值强制转换为所需的特定函数类型。这通常被建议为“use void *
”解决方案,除了void *
不是正确的方法(正式数据指针类型不能与函数指针类型互相转换)。
使用包装器结构类型作为中间人。该语言允许从许多上下文中的相同结构类型的声明中引用结构类型。在某种程度上,这是“无限声明递归”的支持形式。通过利用这个可以做到
struct fptr_struct {
struct fptr_struct (*fptr)(int);
};
并声明返回struct fptr_struct
类型等函数。这也需要一些无关紧要的语法努力来获取返回的指针,即访问嵌套的fptr
字段,但至少它不需要强制转换。
答案 1 :(得分:1)
从函数返回SO ;它可以返回一个虚拟函数指针,然后可以正确地转换它。
这避免了使用void *和非标准的转换。所以它不能回归自己, 但是能够返回一个虚拟fp并且可以通过约定来处理:
#include <stdio.h>
typedef int (*dummy_function_type)(int);
typedef dummy_function_type (*decker_function_t)(int);
dummy_function_type some_task(int someparam)
{
/* do some work.. */
fprintf(stdout, "%s\n", __FUNCTION__); //gcc specific
return 0;
}
dummy_function_type decker_queue_root(int redundantparam)
{
/* do some work.. */
fprintf(stdout, "%s\n", __FUNCTION__); //gcc specific
return (dummy_function_type)some_task;
}
void process_decker_queue(decker_function_t jobs)
{
/* nonstandard gcc function nesting follows */
decker_function_t next_decker(decker_function_t cur_decker, int param)
{
if(!cur_decker)return 0;
return (decker_function_t)(cur_decker(param));
}
decker_function_t cursor;
cursor = jobs;
while(cursor)
{
cursor = next_decker(cursor, 0); //param seems pretty redundant in this context..
}
}
int main()
{
//work queue stack
decker_function_t prime = &decker_queue_root;
process_decker_queue(prime);
fprintf(stdout, "this compiles..\n");
return 0;
}
这给出了以下输出:
$ ./test_frecurse
decker_queue_root
some_task
this compiles..
但是,只有一份工作清单并按顺序调用它们会更简单