我有一些 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++ 中向前声明变量?
最佳答案
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 中,暂定定义仍将帮助您实现这一目标。
关于c++ - 变量的前向声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3714808/