10

我有一些必须移植到 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

4 回答 4

20

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

extern A Unit[10];

// ...

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

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

于 2010-09-15T05:07:21.083 回答
20

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

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

extern struct A Unit[10];

这适用于 C 和 C++。但是,作为副作用,这将提供Unit 外部链接。如果您需要一个具有内部链接的变量,那么您在 C++ 中就不走运了,因为在 C++ 中,不可能前向声明一个具有内部链接的变量。同时,在 C 中的暂定定义仍将帮助您实现这一目标。

于 2010-09-15T05:15:26.407 回答
1

C 允许临时声明变量(我猜)。C++ 没有。一旦定义了“单元”,就不能在同一范围内重新定义它

于 2010-09-15T05:08:23.483 回答
0

Unit创建一个返回对 A[10] 的引用的函数,并将实际数组作为函数中的静态变量。

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

// in cpp file
A[10]& Unit() {
    static A[10] value;
    return value;
}
于 2019-04-17T23:14:41.560 回答