变量的前向声明?

我有一些C代码,我必须移植到C ++。 代码有一个结构

struct A { ... struct A * myPtr; } 

现在声明和初始化两个全局数组,如下所示:

 //Forward declaration of Unit struct A Unit[10]; struct A* ptrUnit[2] = { Unit, Unit+7 }; struct A Unit[10] = { { .., &ptrUnit[0] }, ... }; 

现在虽然这在C中运行良好,但它在C ++中给出了错误(变量重新声明)。 是不是允许变量在C ++中进行前向声明?

在C ++中,变量声明必须以extern为前缀:

 extern A Unit[10]; // ... A Unit[10] = { ... }; 

(请注意,在C ++中,您可以省略前导struct 。)

struct A Unit[10]不是变量的前向声明。 术语“前向声明”通常是指非定义声明,而struct A Unit[10]定义 。 因此,在您的代码中,您在同一源文件中多次定义Unit 。 在C语言中,它是允许的,因为在没有初始化器的C定义中是暂定的定义 。 它们可能在同一翻译单元中多次出现。 在C ++中,没有暂定的定义。 在C ++中,多个定义始终是非法的。

如果您想要变量的真正前向声明,则必须使用关键字extern

 extern struct A Unit[10]; 

这将适用于C和C ++。 但是,作为副作用,这将给予Unit 外部联系。 如果你需要一个带有内部链接的变量,那么你在C ++中就不走运了,因为在C ++中,不可能使用内部链接转发声明一个变量。 同时,在C中,暂定的定义仍然可以帮助您实现这一目标。

C允许变量声明(我猜)。 C ++没有。 一旦定义了“单位”,就无法在同一范围内重新定义