如何声明一个返回函数指针的函数指针

Sim*_*ley 16 c function-pointers function

如何声明一个指向具有相同参数的函数的函数指针,并返回指向具有相同参数的函数的指针.

ie funcPtr指向func1(int a, int b),并func1返回指向另一个函数的指针func2(int a, int b).func2还返回一个具有相同签名的函数指针func1.

TYPE funcPtr = func1;
funcPtr = funcPtr(0, 1);
Run Code Online (Sandbox Code Playgroud)

如何申报funcPtr?应该TYPE是什么?

jxh*_*jxh 18

无法解决的自我参考

这是不可能直接的.如果您尝试定义函数指针类型,其中函数的返回类型是其自己的类型,您将遇到未解析的自引用,这将需要无限递归来解决.

typedef funcType (*funcType)(void);
Run Code Online (Sandbox Code Playgroud)

回来一个 struct

您可以改为声明函数返回结构,并且结构可以包含指向此类函数的指针.

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

struct func foo (void);
struct func bar (void);

struct func foo (void) { return (struct func){ bar }; }
struct func bar (void) { return (struct func){ foo }; }

...
    struct func funcPtr = { foo };
    funcPtr = funcPtr.func();
Run Code Online (Sandbox Code Playgroud)

返回不同的函数指针类型

如果您更喜欢坚持使用严格的指针,则需要使用返回不同函数指针类型的函数.因此,调用的结果必须在被调用之前被转换回正确的指针类型.

typedef void (*funcPtrType)(void);
typedef funcPtrType funcType(void);

funcType foo;
funcType bar;

funcPtrType foo (void) { return (funcPtrType)bar; }
funcPtrType bar (void) { return (funcPtrType)foo; }

...
    funcType *p = foo;
    p = (funcType *)p();
Run Code Online (Sandbox Code Playgroud)

返回索引

您可以改为定义函数以将索引返回到表,该表表示应该调用的函数.

enum funcEnum { fooEnum, barEnum };
typedef enum funcEnum (*funcType)(void);

enum funcEnum foo (void) { return barEnum; }
enum funcEnum bar (void) { return fooEnum; }

funcType funcTable[] = { [fooEnum] = foo, [barEnum] = bar };

...
    funcType p = funcTable[fooEnum];
    p = funcTable[p()];
Run Code Online (Sandbox Code Playgroud)

这是在评论和保罗的答案中提出,但在这里提出完整性.

  • @Lundin:如果函数表示状态,则可以通过返回下一个状态来表示转换. (4认同)
  • @Lundin:这里没有什么特别复杂的. (2认同)
  • @Lundin:你是在思考它.状态机的复杂性不是如何表示特定的转换,而是如何管理状态内的决策,这些决策可能分支到(可能很多)不同的状态作为下一个状态.根据必须管理的边数,直接引发事件或返回状态之间几乎没有区别.无论哪种方式,您都需要验证器来确定状态是否正在进行有效转换.过渡如何编码并不重要. (2认同)
  • @Stargateur:我想我没有直接定义*,但我确实假设OP不想使用强制转换来调用该函数. (2认同)
  • @Lundin你可能不喜欢它,你的反驳很好,但代表状态作为实现它们的函数的指针*是一种流行的(以它的方式)优雅的方法.我想汇编语言程序员习惯这样做.人们一直在问如何永远写出"无限嵌套"的函数指针; 这就是为什么[问题出现](http://c-faq.com/decl/recurfuncp.html)在旧的[C FAQ列表](http://c-faq.com/)中.(我也可以列出一些针对州 - 枚举的论据,但这不是它的地方.) (2认同)

P__*_*J__ 8

这只是没有typedef的示例.您可以尝试更改函数的参数,但语法很糟糕,通常无用.

char (*(*((*foo)()))())()
Run Code Online (Sandbox Code Playgroud)

foo是指向函数的指针,返回指向函数的指针返回指向函数返回char的指针

或者您可以使用typedef

例如

typedef int (*foo2)(int, int);

typedef foo2 (*foo1)(int, int);
typedef foo1 (*foo)(int, int);
Run Code Online (Sandbox Code Playgroud)

或者更一般

typedef int (*foo`n`)(int, int);
typedef foo`n' (*foo'n-1`)(int, int);

...

typedef foo2 (*foo1)(int, int);
typedef foo1 (*foo)(int, int);
Run Code Online (Sandbox Code Playgroud)

  • `(*(*((*foo)()))())()`以某种方式让我想起[Brain-Flak](https://codegolf.stackexchange.com/questions/79625/write-a-brain- flak-classic-interpreter/144386#144386):-) (2认同)