变量的前向声明?

时间:2010-09-15 05:03:11

标签: c++ c arrays struct forward-declaration

我有一些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 ++中进行前向声明?

4 个答案:

答案 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;
}