我有一些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 allows变量被暂时声明(我猜)。 C ++没有。一旦定义了“单位”,就无法在同一范围内重新定义
使Unit
成为一个函数,它返回对A [10]的引用,并使实际数组成为函数中的静态变量。
// in hpp file
A[10]& Unit();
// in cpp file
A[10]& Unit() {
static A[10] value;
return value;
}