考虑以下typedef:
typedef int (*f1)(float);
typedef f1 (*f2)(double);
typedef f2 (*f3)(int);
f2
是一个返回函数指针的函数。与f3
相同,但函数的类型(f3
返回的指针)为f2
。如何在没有typedef的情况下定义f3
?我知道typedef是更清晰,更容易理解的定义f3
的方法。但是,我的目的是更好地理解C语法。
答案 0 :(得分:118)
从f1
的声明开始:
int (*f1)(float);
您希望f2
成为返回f1
的函数的指针,因此请在上面的声明中使用f1
的声明替换f2
:
int (* f1 )(float);
|
+-----+-----+
| |
v v
int (*(*f2)(double))(float);
声明读作
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
您重复f3
:
int (*(* f2 )(double))(float);
|
+---+----+
| |
v v
int (*(*(*f3)(int))(double))(float);
读作
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
答案 1 :(得分:14)
在C ++中,模板的奇迹可以使这更容易。
#include <type_traits>
std::add_pointer<
std::add_pointer<
std::add_pointer<
int(float)
>::type(double)
>::type(int)
>::type wow;
答案 2 :(得分:7)
与typedef相同,只是将函数定义放在其名称的位置。
以下是f2
的样子:
typedef int (*(*f2)(double))(float);
你可以f3
作为练习,因为我假设这是作业;)
答案 3 :(得分:5)
请不要。它可以做到,但会很混乱。 Typedef可以轻松编写和阅读这些简短的代码。
不带参数并返回函数指针f
的函数int (*)(float)
可能类似于(未经测试):
int (*f())(float);
然后,对于其余部分,您只需要继续添加括号,直到它看起来像lisp。
答案 4 :(得分:4)
“左右”规则是解密C的完全规则的规则 声明。它也可以用于创建它们。
答案 5 :(得分:0)
使用std::function
:
typedef std::function<int(float)> f1;
typedef std::function<f1(double)> f2;
typedef std::function<f2(int)> f3;
或
typedef std::function<std::function<std::function<int(float)>(double)>(int)> f3;