我有一些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 ++中进行前向声明?
答案 0 :(得分:19)
在C ++中,变量声明必须以extern
为前缀:
extern A Unit[10];
// ...
A Unit[10] = { ... };
(请注意,在C ++中,您可以省略前导struct
。)
答案 1 :(得分:18)
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中,暂定定义仍然可以帮助您实现这一目标。
答案 2 :(得分:1)
C allows个变量(我猜)。 C ++没有。一旦定义了“单位”,就无法在同一范围内重新定义
答案 3 :(得分:0)
使Unit
一个函数返回对A [10]的引用,并使实际数组为该函数中的静态变量。
// in hpp file
A[10]& Unit();
// in cpp file
A[10]& Unit() {
static A[10] value;
return value;
}