c++ - 变量的前向声明?

标签 c++ c arrays struct forward-declaration

我有一些 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/

相关文章:

c++ - 网络延迟和Application-> ProcessMessages()

C++ 如何使用 any_of 查找函数中的重复数字?

python - C类型, python 。如何在函数参数之一中传回指向 C 动态分配的 double 组的指针?

c - 是否有 gcc 命令行选项来消除警告 : passing argument n discards qualifiers from type

javascript - 在二维数组的特定行上使用 Filter() (Javascript)

c - 从 MPI_Irecv() 访问数据

C++ 将任何类型的参数发送给函数

c++ - boost 异常的错误信息

C 排序麻烦

C 字符串函数参数在返回时为 NULL