将两个别名传递给'typedef struct'意味着什么?

将两个别名传递给'typedef struct'意味着什么?,c,struct,typedef,C,Struct,Typedef,以下代码中的*B是什么意思?我理解typedef和struct之间的混合。然而,这个*B很奇怪 typedef struct Something { ... } A, *B; 我看到许多问题询问如何将typedef与struct混合使用,但没有一个问题谈到这种双重定义。这是typedef关键字的一个不太常见的用例,它允许您在一行中定义两个或多个类型别名。这里说 制作一个名为A的别名,该别名表示struct本身,并且 创建一个名为B的别名,该别名表示指向结构的指针 从这个意义上讲,这类似于写

以下代码中的
*B
是什么意思?我理解
typedef
struct
之间的混合。然而,这个
*B
很奇怪

typedef struct Something
{
...
}
A, *B;

我看到许多问题询问如何将
typedef
struct
混合使用,但没有一个问题谈到这种双重定义。

这是
typedef
关键字的一个不太常见的用例,它允许您在一行中定义两个或多个类型别名。这里说

  • 制作一个名为
    A
    的别名,该别名表示
    struct
    本身,并且
  • 创建一个名为
    B
    的别名,该别名表示指向
    结构的指针
从这个意义上讲,这类似于写

int A, *B;
这里,它声明了一个名为
A
的整数和一个名为
B
的整数指针。这里涉及
*
的语法与
typedef
语句中的语法非常相似,只是它不是引入变量而是引入类型

从另一个角度来看:这相当于将事物分解为两个单独的语句:

typedef struct {
   ...
} A;

typedef A* B;

这里,第一个表示“
A
现在指的是这个
struct
类型,
B
现在指的是一个指向
A
的指针”

我在微软代码中看到过很多这种类型的定义:

typedef struct {
    int count;
    char buffer[128];
} BUFFER, *PBUFFER;
它允许编写如下代码:

void read_buffer(PBUFFER pBuffer) {
    // Do something with pBuffer
}

int main(void) {
    BUFFER buffer;

    read_buffer(&buffer);
    return 0;
}

直接回答您的问题:这种
typedef
允许在代码中的同一位置定义类型和指向类型的指针。

您知道
a
的含义,对吗?你知道在名字前面放一个
*
意味着什么,对吗?把这两者放在一起。更好的样式:
typedefa*B请记住,
*
是声明程序的一部分,而不是底层类型,因此它与
B
的绑定更紧密。这有助于避免常见的错误,即认为
B
C
typedef A*B,C(虽然这在变量声明中比在类型定义中更常见)。@TomKarzes这是一个合理的观点-感谢您提出这一点。我见过不同的公司和风格指南出于不同的原因以不同的方式处理这个问题,通常的建议是“与您正在使用的代码库保持一致”。对于纯粹的风格问题,我倾向于同意,尽管我认为不适当的分组会导致正确性问题,这胜过了风格指南。无论如何,OP的帖子没有这个问题。我喜欢避免教新程序员坏习惯。我经常看到
char*a,b后接“为什么
a=b;
给出错误?”Fwiw,我的个人风格指南说“不要键入定义的指针类型。写出星星不需要比
P
前缀更多的按键,而且更清楚。”(无论如何,对我来说更清楚。)@rici这很有意义,虽然我所做的特定点更可能发生在普通的、非Type的声明中(例如,代码> char *a,b; vs>代码> char *a,b;< /c> >,后者是清楚的,但前者不是。我总是认为声明者的MIS分组部分是坏的样式。