函数类型通常用来声明函数或者用来组成复杂的类型,例如
void foo() {
int bar1(); // 声明一个函数bar,返回int,参数表为空,其类型便是函数类型
int (*p1)(); // p1是一个函数指针,*p1的类型便是一个函数类型,同上
typedef int FUN(); // typedef一个函数类型FUN,该类型返回int,参数表为空
FUN bar2; // 等价于int bar2();
FUN *p2; // 等价于int (*p2)();
FUN *foobar(FUN *); // 声明一个函数foobar,其返回值是FUN *,参数也是FUN *
// 等价于int (*foobar(int (*)()))();
}
C/C++规定函数的返回值不能是函数类型或者数组类型,只能用函数指针或者对象指针
来代替
例如,有如下声明
typedef int F(void);
这种类型的函数不带参数,返回值是int
。那么可以这样声明f
和g
:
F f, g;
相当于声明:
int f(void);
int g(void);
下面这个函数声明是错误的:
F h(void);//因为函数可以返回void
类型、标量类型、结构体、联合体,但不能返回函数类型,也不能返回数组类型。
例如:
int foo() {return 0;}
typedef int FUN();
FUN bar1() { // error!
return foo;
}
FUN *bar2() { // OK!
return foo; // foo将隐式转换为函数指针
}
基本上,可以理解为在C/C++中函数不具有值语义,每个函数必须在编译时就定义,我
们不能在运行中生成和拷贝一个函数