Oma*_*air 8 c c++ arrays struct forward-declaration
我有一些C代码,我必须移植到C++.代码有一个结构
struct A {
...
struct A * myPtr;
}
Run Code Online (Sandbox Code Playgroud)
现在声明和初始化两个全局数组,如下所示:
//Forward declaration of Unit
struct A Unit[10];
struct A* ptrUnit[2] = { Unit, Unit+7 };
struct A Unit[10] = { { .., &ptrUnit[0] },
... };
Run Code Online (Sandbox Code Playgroud)
现在虽然这在C中运行良好,但它在C++中给出了一个错误(变量重新声明).是不是允许变量在C++中进行前向声明?
sbi*_*sbi 19
在C++中,变量声明必须带有extern以下前缀:
extern A Unit[10];
// ...
A Unit[10] = { ... };
Run Code Online (Sandbox Code Playgroud)
(请注意,在C++中,您可以省略前导struct.)
AnT*_*AnT 18
struct A Unit[10]不是变量的前向声明.术语"前向声明"通常是指非定义声明,struct A Unit[10]而是定义.因此,在您的代码中,您Unit在同一源文件中定义了多次.在C语言中,它是允许的,因为在没有初始化器的C定义中暂定的定义.它们可能在同一翻译单元中多次出现.在C++中,没有暂定的定义.在C++中,多个定义始终是非法的.
如果您想要变量的真正前向声明,则必须使用关键字 extern
extern struct A Unit[10];
Run Code Online (Sandbox Code Playgroud)
这将适用于C和C++.但是,作为副作用,这将给予Unit 外部联系.如果你需要一个带有内部链接的变量,那么你在C++中就不走运了,因为在C++中,不可能使用内部链接转发声明一个变量.同时,在C中,暂定的定义仍然可以帮助您实现这一目标.