【问题标题】:What does passing two aliases to `typedef struct` mean?将两个别名传递给“typedef struct”是什么意思?
【发布时间】:2019-06-23 21:39:19
【问题描述】:

以下代码中的*B 是什么意思?我理解typedefstruct 之间的这种混合。不过这个*B很奇怪。

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

我看到多个关于将typedefstruct 混合的问题,但没有一个人谈到了这种双重定义。

【问题讨论】:

  • 你知道A 是什么意思,对吧?你知道在名字前加上* 是什么意思,对吧?把这两个放在一起。

标签: c struct typedef


【解决方案1】:

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

  • 创建一个名为A 的别名,代表struct 本身,并且
  • 创建一个名为 B 的别名,表示指向 struct 的指针。

从这个意义上说,它类似于写类似的东西

int A, *B;

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

另一种理解方式:这相当于将事物分成两个单独的语句:

typedef struct {
   ...
} A;

typedef A* B;

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

【讨论】:

  • 更好的风格:typedef A *B; 请记住,* 是声明符的一部分,而不是底层类型,因此它更紧密地绑定到 B。这有助于避免认为BCtypedef A* B, C; 中具有相同类型的常见错误(尽管这在变量声明中比在类型定义中更常见)。
  • @TomKarzes 这是一个合理的观点 - 感谢您提出它。我见过不同的公司和风格指南出于不同的原因以不同的方式处理这个问题,通常的建议是“与你正在使用的代码库保持一致。”
  • 对于纯粹的风格问题,我倾向于同意,尽管我认为不正确的分组与正确性问题接壤,这胜过风格指南。无论如何,OP的帖子没有这个问题。我喜欢避免教新程序员坏习惯。我经常看到char* a, b; 后面跟着“为什么a = b; 会报错?”
  • Fwiw,我的个人风格指南说“不要 typedef 指针类型。写出星星不需要比P 前缀更多的击键,而且更清晰。” (无论如何,对我来说更清楚。)
  • @rici 这是有道理的,尽管我所说的具体点更可能出现在普通的非 typedef 声明中(例如,char* a, b;char *a, b;。后者很清楚,但前者不是。我总是认为错误地对声明符的部分进行分组是不好的风格。
【解决方案2】:

我在微软代码中经常看到这种类型的定义:

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 允许在代码中的同一位置定义类型和指向类型的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 2014-03-30
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多