变量的前向声明? 我有一些C代码,我必须把它移植到C++。代码有一个结构 struct A { ... struct A * myPtr; }

变量的前向声明? 我有一些C代码,我必须把它移植到C++。代码有一个结构 struct A { ... struct A * myPtr; },c++,c,arrays,struct,forward-declaration,C++,C,Arrays,Struct,Forward Declaration,现在声明和初始化两个全局数组,如下所示: //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++中,变量声

现在声明和初始化两个全局数组,如下所示:

//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 A Unit[10];

// ...

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

(注意C++中可以省略引导<代码>结构> <代码>)< /p> 变量以被强制声明(我猜)。C++没有。一旦定义了“单位”,就不能在同一范围内重新定义它,因为单位[10]不是变量的正向声明。术语“正向声明”通常指非定义声明,而

struct A Unit[10]
是一个定义。因此,在您的代码中,您在同一源文件中多次定义了
Unit
。在C语言中,这是允许的,因为在C语言中,没有初始值设定项的定义是暂定的定义。它们可能在同一翻译单元中多次出现。在C++中,没有所谓的临时定义。在C++中,多个定义总是非法的。 如果要为变量提供真正的正向声明,必须使用关键字
extern

extern struct A Unit[10];

<>这将在C和C++中都有效。但是,作为一种副作用,这将提供
装置
外部链接。如果需要一个具有内部链接的变量,那么C++中就不走运了,因为在C++中,不可能用内部链接来声明变量。同时,在C中,暂定定义仍将帮助您实现这一点。

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

//在hpp文件中
A[10]&单位();
//在cpp文件中
A[10]&单位(){
静态A[10]值;
返回值;
}

有关声明和定义的更多详细信息,请参阅。您关于
同一命名空间的陈述不完全正确。如果标识符
A
未在同一范围内定义,则
结构A
定义具有隐式
类型定义结构A
。类似于
struct A{…}A在C++中是完全合法的,然后<代码> A<代码>(没有<代码>结构> /COD>)引用对象。这是可能的,但并不意味着这是一种好的风格。在POSIX中,您可以使用“sys/stat.h”头文件来定义
struct stat
和函数
stat
@Jens:我不确定这方面的法律细节,但您似乎有一个观点。我相应地编辑了我的答案。@Jens Gustedt:它们仍然存在于不同的标识符空间中,并且没有隐式的
typedef
(否则符号也将在全局标识符空间中定义)。C和C++之间的区别在于,如果符号不位于标识符空间中,则也将在用户定义的类型中查找。在我不久前写的这个回答中有一个稍微长一点的解释:@David:谢谢你的指点。C++的规则比我想象的还要差。