在语法上,typedef
被视为存储类说明符,如extern
or static
。它实际上并没有指定存储类;为了方便起见,它只是这样定义的。因此,您可以替换typedef
为static
并获得具有不同含义但语法相似的声明,并定义相同的标识符。
你有:
typedef int (*pf) (int, int);
替换typedef
为static
:
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/上有一个在线版本