【问题标题】:C: pointer to struct in the struct definitionC:指向结构定义中的结构的指针
【发布时间】:2010-10-05 02:47:54
【问题描述】:

如何在这个结构的定义中有一个指向下一个结构的指针:

typedef struct A {
  int a;
  int b;
  A*  next;
} A;

这是我第一次写它的方式,但它不起作用。

【问题讨论】:

标签: c struct pointers


【解决方案1】:

您可以在一个语句中先定义 typedef 和 forward 声明该结构,然后在后续定义中定义该结构。

typedef struct A A;

struct A
{
    int a;
    int b;
    A* next;
};

编辑:正如其他人所提到的,如果没有前向声明,结构名称在结构定义中仍然有效(即您可以使用struct A),但 typedef 直到 typedef 定义完成后才可用(因此使用只是A 无效)。对于只有一个指针成员,这可能无关紧要,但如果您有一个包含大量自类型指针的复杂数据结构,则可能不太实用。

【讨论】:

  • 这是执行此操作的“规范”方式。
  • unwind:C 的许多编码风格约定强烈反对类型定义结构。我根本不会说它是规范的。
  • 如果我可以投票支持 cmets,Chris Young 将获得 +1。本机类型和聚合结构之间存在巨大差异。 不要将其隐藏在 typedef 后面。
  • @ehemient 为什么我不应该隐藏它?它们只是实现细节。
  • @turner: 因为第一个A 标识struct A 中的结构类型,第二个给该类型命名(别名)A。如果你有typedef int B;,那么int 是类型,B 是类型的新名称。同理,对于typedef struct A A;struct A 是类型,A 是类型的新名称。
【解决方案2】:

除了第一个答案,没有 typedef 和 forward 声明,这也应该没问题。

struct A 
{ 
    int a; 
    int b; 
    struct A *next; 
};

【讨论】:

  • 加上没有 typedef,你实际上知道你是否正在处理代码中的结构
【解决方案3】:

您在A* 之前缺少struct

  typedef struct A {
    int a;
    int b;
    struct A* next;
  } A;

【讨论】:

    【解决方案4】:

    你可以不用前向声明:

    struct A {
        int a;
        int b;
        struct A *next;
    };
    

    【讨论】:

      【解决方案5】:

      拜托,您使用的是 C,而不是 C++。

      如果你真的必须 typedef 一个结构(而我使用的大多数程序员不会¹),这样做:

      typedef struct _A {
          int a;
          int b;
          struct _A *next;
      } A;
      

      明确区分_A(在struct 命名空间中)和A(在类型命名空间中)。

      ¹typedef 隐藏了它所指向的类型的大小和存储——论点(我同意)是,在像 C 这样的低级语言中,试图隐藏任何东西都是有害的并且适得其反。习惯于输入struct A,无论何时你的意思是struct A

      【讨论】:

      • “struct A”如何告诉我它的大小?
      • 它告诉你它是一个聚合结构,因此许多事情,比如将它作为参数传递、返回、比较和a = b 效率低下或不起作用。
      • A 是保留名称。一个就好了。
      • 吹毛求疵:_A 是个坏名字:前导下划线属于编译器。 edit该死的,我想我只是回应了 MSalters。
      • 在我所有的编程过程中,我从来没有遇到过给结构和 typedef 赋予相同名称的问题,然后我只在这种情况下为结构命名(链接列表等) )。我认为你只是在宣传 FUD。你能举一个例子,它会导致为两者命名相同的名称吗?此外,我从来没有在我的所有结构上使用 typedef 遇到任何问题,所以我发现你的论点是“有害且适得其反”有点过头了。
      【解决方案6】:
      typedef struct {
       values
      } NAME;
      

      这是 typedef 结构的更短方式,我认为它是最简单的表示法,只是不要将名称放在前面,而是放在后面。

      你可以这样称呼它

      NAME n;  
      
      NAME *n; // if you'd like a ptr to it.
      

      这种方法有什么问题吗?

      【讨论】:

      • 正如问题中所述,需要在结构(链表)内有一个指针,所以我看不到你的答案在这里添加了什么。
      【解决方案7】:

      使用以下预处理器:

      #define structdef(NAME) typedef struct NAME NAME; struct NAME 
      

      用法:

      structdef(node_t)
      {
         void* value;
         node_t* next;
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-25
        • 1970-01-01
        • 2021-04-01
        • 2017-01-04
        相关资源
        最近更新 更多