如何在 C 中不使用“typedef”来声明函数指针变量的类型?

问题描述 投票:0回答:1

我有一个名为 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]

还有其他方法可以将函数的数据类型声明为函数指针吗?

c pointers casting function-pointers typedef
1个回答
0
投票

我通过使用 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;
© www.soinside.com 2019 - 2024. All rights reserved.