【问题标题】:K&R 2E Typedef pg 146,147K&R 2E Typedef 第 146,147 页
【发布时间】:2011-10-11 11:43:22
【问题描述】:
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 { .. . };

typedef struct tnode *Treeptr;

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

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

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

【问题讨论】:

    标签: c


    【解决方案1】:

    所以在上面,它是创建一个 typedef "Treenode" 并声明 “结构节点”?

    是的,在同一个句子中有声明和类型定义。

    但是为什么我们不能把这个东西隔开呢?像这样: typedef struct tnode * 树指针

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

    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;
    }
    

    【讨论】:

    • 噢,谢谢!可以肯定的是,您要说的是: typedef int (PFI)(char *, char) 自动创建一个 PFI #define,如果我执行 PFI foo bar,那么就像在 #define 中一样(宏)它转换为: int (*PFI)(foo, bar)
    • 不,我写了define作为定义一个类型...抱歉不清楚,我会修复它。
    • @MByD 你能说明如何在一个小代码中使用 PFI 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多