【问题标题】:typedef stuct with forward declaration in C在 C 中具有前向声明的 typedef 结构
【发布时间】:2011-11-16 18:02:25
【问题描述】:

我有类似的东西:

typedef struct Data DATA, *DATA_PTR;
typedef struct Units UNITS, *UNITS_PTR;

struct Data
{
    double miscData;
    UNITS units;
};

struct Units
{
    double x[2];
    double y[2];
    double z[2];
};

在我的project_typedef.h 文件中。

在另一个文件中,我有类似的内容:

void fileInput(DATA_PTR data)
{
     //usual declarations and other things
     data->miscData = 0; //Works!
     data->units.x[0] = 5; //Doesn't work
     //etc...
}

但是,这不起作用,因为单位是在project_typedef.h 中的数据之后声明的(如果我切换它的工作顺序)。我得到的错误是“'.x' 的左侧必须具有结构/联合类型”。我认为前向声明会解决这个问题。为什么不呢?

【问题讨论】:

  • 首先 == 看起来很奇怪...
  • @Tudor,一个错字,但在我的代码中不是这样。现在已经删掉了。
  • 我只想说,当我看到指针类型用作普通类型时,我讨厌。 DATA_PTR 不会以任何方式简化代码编写,因为它仍然是指针,您仍然必须使用 -> 运算符。

标签: c struct typedef forward-declaration


【解决方案1】:

当您定义 Data 时,所有成员都必须是完整类型。由于 UNITS 那时还不是一个完整的类型,所以这不起作用。 (相比之下,UNITS_PTR 很好,因为指向不完整类型的指针是完整类型。)

只需将Units 定义放在Data 定义之上,就可以了。

(正如@cnicutar 已经指出的那样,您还使用了数组x 错误。)

【讨论】:

    【解决方案2】:

    前向声明允许您在允许不完整类型的上下文中使用其名称。声明结构成员不是这种情况之一,必须知道完整的定义,因为它有助于结构布局。

    【讨论】:

      【解决方案3】:

      对于结构定义,您应该始终对结构中的所有成员使用完整类型...但struct Data 中的UNITS units 不是这种情况,它声明了一个名为units 的变量,类型为struct Units在结构数据之前从未声明过...这反映了一个错误..您应该将Units 定义放在Data 定义之上.. 一切都会正常工作..

      并且关于前向声明,这不起作用,因为每当定义结构变量时,编译器首先分配结构所需的内存(结构成员没有分配给它们的内存,除非它们链接到结构变量的类型..这就是为什么结构变量不能在结构模板中初始化).. :)

      【讨论】:

        【解决方案4】:

        struct 没有原型。这是因为编译器在使用它之前需要知道结构的大小。您可以在 struct 上使用指针,因为无论指向哪种类型的指针都知道大小。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-12
          • 1970-01-01
          • 1970-01-01
          • 2010-10-22
          • 1970-01-01
          • 1970-01-01
          • 2013-06-02
          • 1970-01-01
          相关资源
          最近更新 更多