0

我在尝试使用没有初始大小的结构数组时遇到问题。我该怎么做呢?这是我的结构:

struct carbon {
    double temp;
    double mass;
    rowvec::fixed<3> position;      
    rowvec::fixed<3> velocity;
    rowvec::fixed<3> force;
} *atom;

在我的程序中,我正在分配结构数组的大小,如下所示:

  atom = new carbon[PARTICLE_NUM];

问题是我如何在其他文件中使用这个结构。我创建了一个头文件并将其放入其中

extern struct carbon *atom;

但它出现了这个错误:

setup_pos.cpp:19: error: invalid use of incomplete type ‘struct carbon’
system_setup_distances.h:18: error: forward declaration of ‘struct carbon’

我知道我不应该使用全局变量,但我只想先测试一下。在此先感谢您的帮助。

4

4 回答 4

1

结构的定义需要在头文件中。

于 2012-02-19T15:48:26.547 回答
1

您需要将结构的定义包含carbon在头文件中,然后将该头文件包含在您遇到不完整类型错误 的文件(.h或)中。.cpp

为什么会出现错误?
每当您使用前向声明时,该类型就会成为编译器的不完整类型,这是因为编译器只知道前向声明的实体是一种数据类型,但它不知道任何关于布局或其内部的事情,所以如果您执行任何需要编译器需要它抱怨错误的类型布局的操作。

在您的情况下,编译器需要知道结构的大小carbon以分配足够的内存,因为它是前向声明的类型,所以它不能,因此它会抱怨错误。

于 2012-02-19T15:48:36.507 回答
1

您使用的源文件atom需要结构的完整定义carbon

将结构与外部放在同一个头文件中,如下所示:

struct carbon {
    double temp;
    double mass;
    rowvec::fixed<3> position;      
    rowvec::fixed<3> velocity;
    rowvec::fixed<3> force;
};

extern struct carbon *atom;

atom在您的源文件之一中定义变量:

struct carbon *atom = 0;

现在,每当您需要访问时atom,请包含结构和 extern 声明所在的头文件,它应该可以工作。

PS。atom您可以将它放在自己的命名空间中,而不是将变量放在全局命名空间中:

namespace some_clever_name
{
    struct carbon { ... };
    extern carbon *atom;
}

并将其放入源文件中:

some_clever_name::carbon *some_clever_name::atom = 0;
于 2012-02-19T15:51:26.370 回答
0

正如其他答案所说,您需要在头文件中包含结构的定义。但是让我们问问自己为什么需要这个?

C++ 从一开始就基于 C,并从 C 继承了一个简单的编译策略:编译器通过一次,编译器和链接器都不需要访问它们所提供的文件之外的任何内容。最初开发 C 和 UNIX 时,地址空间有限,处理器速度比大多数人想象的要慢——我的 Kindle Fire 比我在 90 年代之前使用的任何计算机都要大。

因为他们使编译器变得简单,而不是像 PL/I(C 的祖先之一)那样使用更复杂的方案,他们构建了预处理器并使用包含文件。编译器需要知道结构的“形状”才能生成代码——例如,如果你想访问mass,你需要知道结构开头的偏移量。因此,在 C 和 C++ 中,您需要在文本中包含对该“形状”的描述。

于 2012-02-19T15:55:37.513 回答