【问题标题】:Why often a struct's tagName differs from the typedef's name?为什么结构标签名称经常与 typedef 名称不同?
【发布时间】:2010-03-01 09:41:00
【问题描述】:

有时我会看到这样的代码(希望我没记错):

typedef struct st {
    int a; char b;
} *stp;

虽然我熟悉的通常模式是:

typedef struct st {
    int a; char b;
} st;

那么第一个代码示例的优势是什么?

【问题讨论】:

  • 星号真的是源代码中的星号吗?还是只是一个通配符?
  • 请把它当作通配符。出于某种原因,我记得一个星号,但它无法编译。
  • 您的意思可能是struct _st 而不是struct *st
  • 您的意思很可能是跟随,正如展开回答的那样:typedef struct st { int a;字符 b; } *stp;
  • 您为什么不编辑问题,以便现在您知道您要问什么?

标签: c struct


【解决方案1】:

你可能是这个意思:

typedef struct ST {
  /* fields omitted */
} *STP;

星号位于语句的末尾。这只是意味着“将类型 STP 定义为指向该类型结构的指针”。 struct 标记 (ST) 不是必需的,它仅在您希望以后能够自行引用结构类型时才有用。

你也可以同时拥有,像这样:

typedef struct {
  /* fields omitted */
} ST, *STP;

这样就可以使用ST 来引用结构类型本身,并使用STP 来指向ST

我个人认为在 typedef 中包含星号是一种非常糟糕的做法,因为它试图将某些东西(类型是指针的事实)编码到类型的名称中,而 C 已经提供了自己的机制(星号)来显示这一点。这使得它非常混乱并破坏了星号的对称性,它出现在声明指针的使用中。

【讨论】:

  • typedef ing * 对于不透明类型很有用,它可以实现为指针,但也可以实现为数字 id;如果做得明智,通过typedef 隐藏信息是一件好事
【解决方案2】:

这种习惯源于 typedef 名称和 struct 标记名在同一个命名空间中的时候。见http://blogs.msdn.com/oldnewthing/archive/2008/03/26/8336829.aspx

【讨论】:

  • 您是否有其他参考资料暗示曾经有过这样的时间?我将尝试在 DMR 主页和我拥有的其他一些旧文档中进行挖掘。确认。我不记得了。 (我记得成员命名空间对于所有结构和联合都是唯一的,这解释了 Unix 结构的成员名称中的前缀)。
  • 不,但我认为 OldNewThing 相当可靠。
【解决方案3】:

我想你在说:

typedef struct{ int a; char b; } object, *objectPointer;

这意味着(新)类型 objectPointer 是指向上面定义的struct(对象)的指针。以这种方式声明指向对象struct 的指针很容易。例如,

objectPointer A = (objectPointer)malloc(sizeof(object)); A->a = 2;

现在,A 是一个指向结构对象的指针,您可以按上述方式访问其变量。

如果没有定义 objectPointer,

struct object *A = (struct object *)malloc(sizeof(object)); A->a = 2; 所以,我猜 objectPointer 更 intuitiveeasy 使用。

【讨论】:

  • 不,这意味着object 类型的东西是指向struct _object 的指针。
  • +1。在第一个代码中:结构末尾是否省略了分号? (第 4 行)
  • @Dor:是的。结构后的分号。
【解决方案4】:

我希望第一个代码会说编译器错误,

【讨论】:

    【解决方案5】:

    我看不出 typedef 名称与标签名称不同的充分理由。

    现在,如果你不想使用标签名称需要类型定义的原因

    struct tag v;
    

    但是

    tag v;
    

    可能是历史性的。只要我记得,C 就有 typedef,但我不知道在引入 struct 时它是否正确(处理 typedef 是 C 语法中的一个麻烦)。在我见过的旧代码中,没有使用typedef for struct,还有unix之类的东西

    struct stat;
    int stat(const char*, struct stat*);
    

    这将与自动 typedef 中断。引入了一个,更改非常困难(是的,C++ 具有自动 typedef,但 C++ 有特殊的措辞来处理这种重载情况,这将是另一个复杂因素)。

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 2013-07-17
      • 2020-08-13
      • 1970-01-01
      • 2011-05-19
      • 2012-11-02
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多