我有一个简单的问题:C或C中的函数类型是什么因为我们可以在C或C中有指向函数的指针,这意味着函数应该有一个特定的类型,否则在创建指向函数的指针时进行类型检查是没有意义的。有人能解释一下我,我走的路是对的还是错的?如果我在正确的路径上,我怎么能找到函数的类型?
mec1mxoz1#
C/C++中的函数类型包括return type和types of input parameters。考虑下面的函数声明:
return type
types of input parameters
int function(char, float);
指向该函数的指针具有以下类型:
int (*funptr)(char, float);
同样,一般情况下:
returntype function (argtype1, argtype2, argtype3)
指向此类函数的相应指针为
returntype (*ptr) (atgtype1, atgtype2, atgtype3);
有许多不同类型的函数。找到一个useful reference on function pointers here。此外,这种分类是基于return type and argument types的。函数 * 也可以根据其可访问性的范围进行分类。* 如全局函数、静态函数等。参见此处for a short introduction。
return type and argument types
qvtsj1bj2#
当然每个函数都有它的类型,例如,函数
double foo(bar& f, const const baz*)
具有一种
function, that accepts reference to bar and constant pointer to baz and return double
它可以写成
double ()(bar&, const baz*)
指向该函数类型的变量的指针将具有类型(可以存储指向该函数的指针的变量)将具有类型
double (*)(bar&, const baz*)
或者,如果你想typedef一个指向该类型函数的指针,你可以写
typedef
typedef double (*func_ptr)(bar&, const baz*)
再一次
func_ptr is a type of pointer to function, that accepts reference to bar and constant pointer to baz and return double
这里有一点就是函数衰减为指向函数的指针,所以你可以写
func_ptr f = &foo;
以及
func_ptr g = foo;
一切都会一样。现在想象一下,你有
struct A { double goo(bar& f, const const baz*); };
现在goo有一个类型
goo
function of struct A, that accepts reference to bar and constant pointer to baz and return double
指向此函数的指针将具有类型
double (A::*)(bar&, const baz*)
注意,它的类型与自由函数foo的类型 * 不同 *。它们根本不兼容。然而,如果goo是static函数,则它属于struct A的事实将是不够的(只要成员函数需要隐式this参数而static函数不需要)。
foo
static
struct A
this
yhived7q3#
它实际上是function signature,应该与declaration或function pointer匹配函数签名包含所有内容,如参数类型,参数数目和返回类型.就像变量一样,不能直接说特定函数是int类型、float类型或char类型等永远记住它是signature,就像我上面说的。
function signature
declaration
function pointer
int
float
char
signature
z0qdvdin4#
每一对两个类型(A,B)都有一个特定的函数类型A-〉B。如果我们选择A=int,B=float,那么函数类型将变为:
float my_function(int a);
4条答案
按热度按时间mec1mxoz1#
函数指针的语法
C/C++中的函数类型包括
return type
和types of input parameters
。考虑下面的函数声明:
指向该函数的指针具有以下类型:
同样,一般情况下:
指向此类函数的相应指针为
有许多不同类型的函数。找到一个useful reference on function pointers here。
此外,这种分类是基于
return type and argument types
的。函数 * 也可以根据其可访问性的范围进行分类。* 如全局函数、静态函数等。参见此处for a short introduction。qvtsj1bj2#
当然每个函数都有它的类型,
例如,函数
具有一种
它可以写成
指向该函数类型的变量的指针将具有类型(可以存储指向该函数的指针的变量)
将具有类型
或者,如果你想
typedef
一个指向该类型函数的指针,你可以写再一次
这里有一点就是函数衰减为指向函数的指针,所以你可以写
以及
一切都会一样。
现在想象一下,你有
现在
goo
有一个类型指向此函数的指针将具有类型
注意,它的类型与自由函数
foo
的类型 * 不同 *。它们根本不兼容。然而,如果
goo
是static
函数,则它属于struct A
的事实将是不够的(只要成员函数需要隐式this
参数而static
函数不需要)。yhived7q3#
它实际上是
function signature
,应该与declaration
或function pointer
匹配函数签名包含所有内容,如参数类型,参数数目和返回类型.
就像变量一样,不能直接说特定函数是
int
类型、float
类型或char
类型等永远记住它是
signature
,就像我上面说的。z0qdvdin4#
每一对两个类型(A,B)都有一个特定的函数类型A-〉B。如果我们选择A=int,B=float,那么函数类型将变为: