功能回归

Dre*_*wen 29 c function

是否可以声明一些func_t返回该类型的函数类型,func_t

换句话说,函数是否可以返回自身?

// func_t is declared as some sort of function pointer
func_t foo(void *arg)
{
  return &foo;
}
Run Code Online (Sandbox Code Playgroud)

或者我必须使用void *和类型转换?

oua*_*uah 15

不,你不能在C中声明递归函数类型.除了在结构(或联合)内部,在C中声明递归类型是不可能的.

现在对于void *解决方案,void *只保证保存指向对象的指针而不是指向函数的指针.能够转换函数指针,void *仅作为扩展名提供.

  • 对于它的价值,在通常的"具有用于执行状态机前进的函数指针的状态机"设置中,你可以有一个函数返回一个`struct state_machine`对象,其中有一个指向函数的指针具有类型` struct state_machine(*fp)(args)`.然后函数`foo`可以"返回自身":`struct state_machine ret; ret.fp = foo; ...返回ret;` (5认同)
  • 如何添加所有功能指针类型都是往返可转换的呢? (2认同)

Dre*_*wen 13

结构的可能解决方案:

struct func_wrap
{
    struct func_wrap (*func)(void);
};

struct func_wrap func_test(void)
{
    struct func_wrap self;

    self.func = func_test;
    return self;
}
Run Code Online (Sandbox Code Playgroud)

编译gcc -Wall没有给出任何警告,但我不确定这是否是100%便携式的.

  • 这太棒了,根本没有铸造,干净的类型!应该是首选答案,因为这不仅提供了解释,而且提供了适当的解决方案。我喜欢传递函数对象的 C++ 方式(有点……)! (3认同)
  • 使用-pedantic进行编译以警告使用非标准功能. (2认同)