2

如果在第 3 行中没有为 typedef 提供名称,以下代码如何工作?编译器如何将 pf 假定为新数据类型?

#include <stdio.h>

int fun(int, int);
typedef int (*pf) (int, int);
int proc(pf, int, int);

int main(){
    printf("%d\n", proc(fun, 6, 6));
    return 0;
}

int fun(int a, int b){
    return (a==b);
}

int proc(pf p, int a, int b){
    return ((*p)(a, b));
}
4

5 回答 5

7

它确实给了它一个名字:

 typedef int (*pf) (int, int);
               ^^

那是 typedef 的名称。它读作:pf 是一个指向函数的指针,该函数接受两个 int 并返回一个 int

有关函数指针类型定义如何工作的更多详细信息,请参阅:

于 2013-09-01T18:09:20.747 回答
2

pf作为一个函数的别名,它接受两个ints 作为参数并返回一个int.

它是一个函数指针。

于 2013-09-01T18:10:29.320 回答
2

在语法上,typedef被视为存储类说明符,如externor static。它实际上并没有指定存储类;为了方便起见,它只是这样定义的。因此,您可以替换typedefstatic并获得具有不同含义但语法相似的声明,并定义相同的标识符。

你有:

typedef int (*pf) (int, int);

替换typedefstatic

static int (*pf) (int, int);

它声明了一个名为pf. 声明的typedef版本也声明了标识符pf,但作为类型名称,而不是作为指针对象。

请记住,typedef这不会创建新类型,而只是现有类型的新名称。声明不是声明pf为对象,而是为类型 nametypedef创建pf一个别名int (*)(int, int)

由于存储类说明符是可选的,因此您还可以typedef通过删除单词来理解复杂的声明typedef

int (*pf) (int, int);

它声明pf为类型的对象int (*) (int, int)

您还可以使用该cdecl程序来解释这样的复杂声明。它不理解typedef(从 2.5 版开始),但您可以删除typedef关键字:

$ cdecl
Type `help' or `?' for help
cdecl> explain typedef int (*pf) (int, int);
syntax error
cdecl> explain int (*pf) (int, int);
declare pf as pointer to function (int, int) returning int
cdecl> 

如果您的系统上没有安装该cdecl程序,在http://cdecl.org/上有一个在线版本

于 2013-09-01T19:08:25.150 回答
1

pf因为 typedef 是一个类型定义;它定义了函数的签名(作为参数提供什么以及它将返回什么)。对于用作变量proc的函数;p它在地址处执行此函数时定义了“合同” p;这个合约只能在编译时检查,因为基本上在运行时p变量只是一个地址。

于 2013-09-01T19:00:13.103 回答
0

typedef 声明有一个名字——'pf'。它代表一个函数指针(而不是指向数据,它指向内存中的可执行代码)。

声明函数指针时,typedef 不遵循(通常的)模式——“typedef oldTypeName newAliasName”。相反,别名(即上面示例中的 pf)出现在返回类型(左侧)和参数类型(右侧)之间。

于 2013-09-01T18:23:04.867 回答