我有一个名为 add 的函数,它将两个整数相加,如下所示:
int add(int a, int b){
return a + b;
}
我想创建一个指向我的函数的指针,名为 a 并使用它调用我的函数
printf("The sum of 45, 23: %d\n", a(45, 23));
我通过使用 typedef
为我的函数创建类型来做到这一点typedef int (*Aptr) (int, int);
Aptr a = &add;
printf("The sum of 45, 23: %d\n", a(45, 23));
The sum of 45, 23: 68
但是当我尝试将 typedef 语句中的类型与我的变量一起使用时,它会导致错误,我也尝试删除替换名称,但它引发了错误。如果 typedef 的目的只是为现有数据类型创建新名称,为什么这不起作用?
int (*Aptr) (int, int); a = &add;
int (*) (int, int); a = &add;
对于这两种情况:
[Error] 'a' undeclared (first use in this function)
[Note] each undeclared identifier is reported only once for each function it appears in
[Warning] implicit declaration of function 'a' [-Wimplicit-function-declaration]
还有其他方法可以将函数的数据类型声明为函数指针吗?
我通过使用 typedef
为我的函数创建类型来做到这一点
Nitpick:您通过使用 typedef 为函数类型声明别名来做到这一点。 这不会创建类型。
如果 typedef 的目的只是为现有数据类型创建新名称,为什么这不起作用?
因为你做错了。
将
typedef
添加到有效声明中表示,该标识符将充当该类型的别名,而不是声明指定的标识符指定指定类型的对象或函数。如果您想声明一个实际的对象或函数,那么您需要做的就是 remove typedef
:
int (*Aptr) (int, int);
当然,您可以选择不同的标识符:
int (*a) (int, int);
其中每一个都声明一个指向函数的指针,该函数具有两个
int
类型的参数并返回 int
。
这个变化:
int (*Aptr) (int, int); a = &add;
同时包含声明 (
int (*Aptr) (int, int);
) 和声明 (a = &add;
)。正如已经讨论过的,前者是 Aptr
作为函数指针的完全有效的声明。 第一个分号后面的部分是单独的,尝试为未声明的变量赋值a
。
这个变化:
int (*) (int, int); a = &add;
类似,但有点远。
int (*) (int, int)
是一个有效的类型名称,它可以在类型转换中以这种形式使用,但是要声明该类型的变量,您需要将变量名称放在内部的适当位置。 您想要的形式是:
int (*a) (int, int) = &add;
或者,
int (*a) (int, int);
a = &add;