K&R 2E Typedef 第 146,147 页

1 c

typedef struct tnode { ... } Treenode;
Run Code Online (Sandbox Code Playgroud)

既然typedef不能为我们创建一个新的类型,那么这部分是“struct tnode”的声明吗?那么在上面,它是否创建了一个 typedef“Treenode”并声明了“struct tnode”?

return (Treeptr) malloc(sizeof(Treenode));
Run Code Online (Sandbox Code Playgroud)

在这里,由于 Treenode 是整个“struct tnode”声明的同义词,是否有必要将整个声明传递给 sizeof 或者可以这样做: sizeof(struct tnode) 在通过 struct tnode { ... }; 在别处声明 tnode 之后;

typedef struct tnode *Treeptr;
Run Code Online (Sandbox Code Playgroud)

typedef 为:typedef old-existing-type newtype;所以在这里.. struct tnode * 是旧类型,它必须已经存在(必须在其他地方声明),而 Treeptr 是它的同义词..但为什么我们不能把这个东西隔开??像这样: typedef struct tnode * Treeptr;

typedef int (*PFI)(char *, char *);
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?旧类型是 int 并且 (*PFI)(char , char ) 是 int 的同义词?? 如果 int (*PFI)(char *, char *) 是旧类型,那么新类型是什么??他说“实际上 typedef 就像#define,只是因为它是由编译器解释的,它可以处理超出预处理器能力范围的文本替换”是什么意思?在提到的例子中..为什么预处理器不能做任何正在做的事情?

MBy*_*ByD 5

那么在上面,它是否创建了一个 typedef“Treenode”并声明了“struct tnode”?

是的,同一句话中既有声明又有 typedef。

但为什么我们不能把东西隔开??像这样: typedef struct tnode * Treeptr

如果你在谈论*- 你可以。无论如何,它是一个单独的令牌。

typedef int (*PFI)(char *, char *);
Run Code Online (Sandbox Code Playgroud)

这是一个函数类型定义;

typedef int (*PFI)(char *, char *);
^ define a type called
              ^PFI as:
             ^ pointer
                  ^to function
                   ^that receives two char pointers as arguments
        ^ and returns an int
Run Code Online (Sandbox Code Playgroud)

现在您可以使用 PFI 而不是int (*)(char *, char *)(当用作参数/变量时)

编辑:

使用函数指针的代码示例:

#include <stdio.h>

int add(int a, int b) { return a + b; }

typedef int (*pfi)(int,int);

int main()
{
    pfi my_func = add;
    int res;
    res = (*my_func)(1,2);
    printf( "add(1,2)=%d", res);
    return res;
}
Run Code Online (Sandbox Code Playgroud)