K& R 2E Typedef pg 146,147

时间:2011-07-23 02:21:29

标签: c

typedef struct tnode { ... } Treenode;

由于typedef无法为我们创建新类型,这是“struct tnode”声明的一部分吗?那么在上面,是否创建了一个typedef“Treenode”并声明“struct tnode”?

return (Treeptr) malloc(sizeof(Treenode));

这里,由于Treenode是整个“struct tnode”声明的同义词,是否有必要将整个声明传递给sizeof,或者只需执行:sizeof(struct tnode)在通过struct tnode {..在其他地方声明tnode之后。 。};

typedef struct tnode *Treeptr;

Typedef是:typedef old-existing-type newtype;所以这里.. struct tnode *是必须已经存在的旧类型(必须在别处声明),而Treeptr是那个的同义词..但为什么我们不能将这个东西空间化?像这样:typedef struct tnode * Treeptr;

typedef int (*PFI)(char *, char *);

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

1 个答案:

答案 0 :(得分:4)

  

所以在上面,是否创建了一个typedef“Treenode”AND声明   “struct tnode”?

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

  

但为什么我们不能把这个东西放在空间?像这样:typedef struct tnode *   Treeptr

如果你在谈论* - 你可以。无论如何,这是一个单独的标记。

typedef int (*PFI)(char *, char *);

这是一个函数类型定义;

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

现在您可以使用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;
}