Typedef函数指针,用于返回指向其自身类型函数的指针的函数?

时间:2013-11-15 22:59:29

标签: c

那是满口的。基本上我有这个:

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 ++,

2 个答案:

答案 0 :(得分:3)

无法直接申报。语法语法没有提供破解本声明中固有存在的无限声明性递归的机会,这很遗憾,因为它没有物理递归。

解决方法包括

  1. 对返回类型使用“generic”函数指针类型void (*)(void)。当然,您必须将返回的值强制转换为所需的特定函数类型。这通常被建议为“use void *”解决方案,除了void *不是正确的方法(正式数据指针类型不能与函数指针类型互相转换)。

  2. 使用包装器结构类型作为中间人。该语言允许从许多上下文中的相同结构类型的声明中引用结构类型。在某种程度上,这是“无限声明递归”的支持形式。通过利用这个可以做到

    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..

但是,只有一份工作清单并按顺序调用它们会更简单