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)
这只是没有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)