在语法上,typedef被视为存储类说明符,如externor 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/上有一个在线版本