【问题标题】:Typedef-ing nonexisting struct in c在c中对不存在的结构进行类型定义
【发布时间】:2015-12-06 22:42:31
【问题描述】:

目前正在学习指针和结构体,下面的看不懂

typedef struct at atom;
struct at {
     int element = 5;
     struct at *next;
}

这段代码怎么没有报错?

当我使用创建原子时

atom x;
printf("%d", x.element);

它将打印 5。

我不明白不存在结构的类型定义,它是如何工作的?

【问题讨论】:

    标签: c++ struct typedef


    【解决方案1】:
    typedef struct at atom;
    

    在这里,您声明一个名为 atstruct 并给它一个 typedefatom。所以这是完全有效的 C。

    struct at {
         int element = 5;
         struct at *next;
    }
    

    在这里,您正在定义您之前声明的结构at

    注意:

    需要注意的是,在 C 语言中,不允许像在此处那样初始化结构中的变量:

    struct at {
         int element = 5; // <---- Illegal in C
         struct at *next;
    }
    

    但是,这在 C++ 中完全没问题,所以如果您尝试使用 C,请删除变量初始化,但如果您使用 C++,那么它就可以了。

    【讨论】:

    • 但是 C 中不允许初始化结构成员 (int element = 5;)。
    • @l3x 在 C 中你是正确的,但是你可以这样做是 C++ See here
    【解决方案2】:

    这是一个前向声明——在 C 语言中,您可以声明一个命名事物将存在,而无需在稍后提供有关它的详细信息;这最常用于允许知识循环;例如struct A 有一个指向struct B 的指针,struct B 有一个指向struct C 的指针,struct C 有一个指向struct A 的指针。在那种特定的情况下,只要你说这些东西是结构,那么编译器就对类型有足够的了解,从而知道合适的指针是什么样的。

    在这种情况下,您已声明将有一个名为at 的结构,并且您希望将其称为atom。如果您在告诉编译器 struct at 看起来像什么之前尝试声明 atom,那将是一个错误。但在此之前,编译器有足够的信息继续进行。

    【讨论】:

      【解决方案3】:

      你忘了放分号

      typedef struct at atom;
      struct at {
           int element = 5;
           struct at *next;
      }
      ^^^^
      

      考虑到它是 C++ 代码。在 C 中,您不能在其定义中初始化结构的数据成员。

      此声明

      typedef struct at atom;
      

      声明了两件事。首先,它在当前声明区域中声明了新类型struct at。它为这种类型声明了一个别名atom

      每个声明不必同时是一个定义。

      首先声明struct at,然后定义

      struct at {
           int element = 5;
           struct at *next;
      };
      

      将这种方法与函数进行比较。函数也可以被声明多次,并且只定义一次。例如

      void f();
      void f();
      //...
      void f();
      
      void f() { std::cout << "It is a joke" << std::endl; }
      

      同样的方式,一个结构可以被多次声明,但只能被定义一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-02
        • 2022-12-15
        • 2020-11-14
        • 2023-03-08
        相关资源
        最近更新 更多