struct A Unit[10]
не является предварительным объявлением переменной.Термин «предварительное объявление» обычно относится к не определяющим объявлениям, тогда как struct A Unit[10]
является определением .Таким образом, в вашем коде вы определяете Unit
несколько раз в одном и том же исходном файле.На языке C это разрешено, поскольку в определениях C без инициализатора есть предварительные определения .Они могут встречаться много раз в одной и той же единице перевода.В C ++ нет такого понятия, как предварительное определение.В C ++ множественные определения всегда недопустимы.
Если вы хотите подлинное прямое объявление для переменной, вы должны использовать ключевое слово extern
extern struct A Unit[10];
Это будет работать как в C, так иC ++.Однако, как побочный эффект, это даст Unit
внешнюю связь.Если вам нужна переменная с внутренней связью, то вам не повезло в C ++, поскольку в C ++ невозможно объявить переменную с внутренней связью.Между тем предварительные определения в Си все еще помогут вам достичь этого.