变量的前向声明?

问题描述 投票:8回答:4

我有一些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++ c arrays struct forward-declaration
4个回答
19
投票

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

extern A Unit[10];

// ...

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

(请注意,在C ++中,您可以省略领先的struct。)


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中,暂定的定义仍然可以帮助您实现这一目标。


1
投票

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


0
投票

使Unit成为一个函数,它返回对A [10]的引用,并使实际数组成为函数中的静态变量。

// in hpp file
A[10]& Unit();

// in cpp file
A[10]& Unit() {
    static A[10] value;
    return value;
}
© www.soinside.com 2019 - 2024. All rights reserved.