我在尝试使用没有初始大小的结构数组时遇到问题。 我该怎么做呢?这是我的结构:
struct carbon {
double temp;
double mass;
rowvec::fixed<3> position;
rowvec::fixed<3> velocity;
rowvec::fixed<3> force;
} *atom;
在我的程序中,我正在分配struct数组的大小:
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’
我知道我不应该使用全局变量,但我只是想先测试一下。 在此先感谢您的帮助。
答案 0 :(得分:1)
struct的定义需要在头文件中。
答案 1 :(得分:1)
您需要在头文件中包含结构carbon
的定义,然后将该头文件包含在文件(.h
或.cpp
)中,以获取那些不完整的类型错误。
为何出错?
无论何时使用前向声明,该类型都会成为编译器的不完整类型,这是因为编译器只知道前向声明的实体是一种数据类型,但它对布局或其内部结构一无所知,所以如果你执行任何操作需要编译器需要其出错的类型布局的操作。
在您的情况下,编译器需要知道结构carbon
的大小以分配足够的内存,因为它是前向声明的类型,因此它不会因错误而抱怨。
答案 2 :(得分: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;
答案 3 :(得分:0)
正如其他答案所说,您需要在头文件中包含结构的定义。但是,让我们自问为什么你需要这个?
C ++从一开始就基于C,并且从C继承了一个简单的编译策略:编译器进行一次传递,编译器和链接器都不需要访问除了它们所呈现的文件之外的任何内容。当C和UNIX最初开发时,地址空间有限,处理器比大多数人想象的要慢 - 我的Kindle Fire比90年代以前使用的任何东西都要大。
因为它们使编译器变得简单,而不是使用更复杂的方案,如PL / I(C的祖先之一),他们构建了预处理器并使用包含文件。编译器需要知道&#34;形状&#34;结构,所以它可以生成代码 - 例如,如果你想访问mass
,你需要知道从结构的开头的偏移量。因此,在C和C ++中,您需要在文本上包含对&#34;形状&#34;的描述。