gpt4 book ai didi

c - 如何声明返回函数指针的函数指针

转载 作者:太空狗 更新时间:2023-10-29 16:32:02 24 4
gpt4 key购买 nike

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

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

TYPE funcPtr = func1;
funcPtr = funcPtr(0, 1);

如何声明funcPtrTYPE 应该是什么?

最佳答案

不可解析的自引用

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

typedef funcType (*funcType)(void);

返回一个结构

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

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();

返回一个不同的函数指针类型

如果您更喜欢严格使用指针,则需要求助于定义返回不同函数指针类型的函数。因此,调用的结果必须在调用之前转换回正确的指针类型。

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();

返回索引

您可以改为定义您的函数以返回一个表的索引,该表表示应调用的函数。

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()];

这是在评论和 Paul's answer 中提出的,但为了完整起见在此呈现。

关于c - 如何声明返回函数指针的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50638893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com