变量的前向声明?

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.)

  • 有关声明和定义的更多详细信息,请参阅[此答案](http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-declaration/1410632#1410632). (2认同)
  • 你关于"同一名称空间"的陈述并不完全正确.如果标识符"A"未在同一范围内定义,则"struct A"定义具有隐式的"typedef struct AA".像`struct A {...} A;`之类的东西在C++中是完全合法的,然后`A`(没有`struct`)引用对象.但这是可能的,并不意味着这是一种好的风格.在POSIX中,您可以使用"sys/stat.h"头文件来定义`struct stat`和函数`stat`. (2认同)
  • @Jens Gustedt:它们仍然存在于不同的标识符空间中,并且没有隐式的`typedef`(否则该符号也将在全局标识符空间中定义).这里C和C++的区别在于,如果符号不在标识符空间中,它也将在用户定义的类型中查找.我在前一段时间写的这个答案中有一个稍长的解释:http://stackoverflow.com/questions/1675351/typedef-struct-vs-struct-definitions/1675446#1675446 (2认同)

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中,暂定的定义仍然可以帮助您实现这一目标.