kev*_*man 35 c function-pointers
考虑以下typedef:
typedef int (*f1)(float);
typedef f1 (*f2)(double);
typedef f2 (*f3)(int);
Run Code Online (Sandbox Code Playgroud)
f2是一个返回函数指针的函数.与...相同f3,但函数的类型,f3返回的指针是f2.如何在f3没有typedef的情况下定义?我知道typedef是更清晰,更容易理解的定义方式f3.但是,我的目的是更好地理解C语法.
Joh*_*ode 121
从您的声明开始f1:
int (*f1)(float);
Run Code Online (Sandbox Code Playgroud)
您希望f2成为返回函数的指针f1,因此f1在上面的声明中用以下声明替换f2:
int (* f1 )(float);
|
+-----+-----+
| |
v v
int (*(*f2)(double))(float);
Run Code Online (Sandbox Code Playgroud)
声明如下
f2 -- f2
*f2 -- is a pointer
(*f2)( ) -- to a function
(*f2)(double) -- taking a double parameter
*(*f2)(double) -- returning a pointer
(*(*f2)(double))( ) -- to a function
(*(*f2)(double))(float) -- taking a float parameter
int (*(*f2)(double))(float) -- returning int
Run Code Online (Sandbox Code Playgroud)
您重复以下过程f3:
int (*(* f2 )(double))(float);
|
+---+----+
| |
v v
int (*(*(*f3)(int))(double))(float);
Run Code Online (Sandbox Code Playgroud)
读作为
f3 -- f3
*f3 -- is a pointer
(*f3)( ) -- to a function
(*f3)(int) -- taking an int parameter
*(*f3)(int) -- returning a pointer
(*(*f3)(int))( ) -- to a function
(*(*f3)(int))(double) -- taking a double parameter
*(*(*f3)(int))(double) -- returning a pointer
(*(*(*f3)(int))(double))( ) -- to a function
(*(*(*f3)(int))(double))(float) -- taking a float parameter
int (*(*(*f3)(int))(double))(float); -- returning int
Run Code Online (Sandbox Code Playgroud)
Pup*_*ppy 14
在C++中,模板的奇迹可以使这更容易.
#include <type_traits>
std::add_pointer<
std::add_pointer<
std::add_pointer<
int(float)
>::type(double)
>::type(int)
>::type wow;
Run Code Online (Sandbox Code Playgroud)
与typedef相同,只是将函数定义放在其名称的位置.
这是怎么f2样的:
typedef int (*(*f2)(double))(float);
Run Code Online (Sandbox Code Playgroud)
你可以做f3一个练习,因为我假设这是家庭作业;)
只是不要.它可以做到,但会很混乱.Typedef可以轻松编写和阅读这些简短的代码.
一个函数f,它没有参数,并返回一个函数指针int (*)(float)可能会是这样的(未经测试):
int (*f())(float);
Run Code Online (Sandbox Code Playgroud)
然后,对于其余部分,您只需要继续添加括号,直到它看起来像lisp.