Forward declarations for variables?
struct A Unit[10]
is not a forward declaration of a variable. The term "forward declaration" normally refers to non-defining declarations, while struct A Unit[10]
is a definition. So in your code you are defining Unit
multiple times in the same source file. In C language it is allowed, since in C definitions without an initializer are tentative definitions. They may occur many times in the same translation unit. In C++ there's no such thing as tentative definition. In C++ multiple definitions are always illegal.
If you want a genuine forward declaration for a variable, you have to use the keyword extern
extern struct A Unit[10];
This will work in both C and C++. However, as a side effect, this will give Unit
external linkage. If you need a variable with internal linkage, then you are out of luck in C++, since in C++ it is not possible to forward-declare a variable with internal linkage. Meanwhile, in C tentative definitions will still help you to achieve that.
C allows variables to be tenatively declared (I guess). C++ does not. Once 'Unit' has been defined, it cannot be redefined in the same scope
In C++, a variable declaration must be prefixed with extern
:
extern A Unit[10];
// ...
A Unit[10] = { ... };
(Note that in C++ you can omit the leading struct
.)