将结构体名的typedef定义为指针

4

所以A是在其他地方定义的结构。您可以忽略此处定义变量的顺序。 在这里,当我使用'B'来定义一个新变量时,到底发生了什么?它是创建一个指向类型为A的结构体的指针变量吗?当遇到'typedef struct A *B;'时,尽可能详细地解释发生了什么。谢谢。

typedef struct A  *B;

typedef struct {
    B pd_ctx;
} C;

static inline B convert (B handle)
{
    C *ctx;

    ctx = (C *)handle;

    return (ctx->pd_ctx);
}

请添加语言标签。 - n. m.
除了别名违规之外,您指的是什么? AC 是不相关的类型。从指向 A 的指针转换为指向 C 的指针最好谨慎处理。 - WhozCraig
2个回答

3
typedef struct A  *B;

当我使用“B”来定义一个新变量时,到底发生了什么?它是创建一个指向类型A结构体的变量指针吗?
是的。如果您这样看待它可能会更清晰:
typedef struct A*  B;

星号的位置是风格问题,就像参数和声明一样。

在这种情况下,B不是指针,它是指针类型。


那么 'typedef type_A (*func)(<arguments>);' 呢? - user1467764
这定义了 func 作为一个 函数指针 类型;然后你可以创建一个 func f,将其分配给一个已定义的返回 type_A 并带有 <arguments> 的函数;如果该函数名为 foobar,则 func f = foobar。然后你可以使用指针调用该函数,即 f(<actual arguments>) - CodeClown42

0

typedef 只是创建了一个类型别名,而不是新的类型,它只是其他类型的缩写或重写。例如,如果您编译 以下代码

typedef int T1;

void fun1(int) {}
void fun1(T1) {}

由于函数fun1的重新定义,您将收到编译器错误。

关于typedef的语法,它有两个部分:

typedef type_declaration identifier;

在你的情况下:

 typedef |struct A *|B|;

星号不是标识符的有效字符。标识符只有B,而星号属于类型声明部分。

总之,Bstruct A*类型的别名或替代写法,当然,pd_ctx的类型也是struct A*


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接