Форвардные объявления для переменных? - PullRequest
8 голосов
/ 15 сентября 2010

У меня есть код на 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 ++?

Ответы [ 4 ]

19 голосов
/ 15 сентября 2010

В C ++ переменная объявление должно начинаться с префикса extern:

extern A Unit[10];

// ...

A Unit[10] = { ... };

(Обратите внимание, что в C ++ вы можете опустить ведущий struct.)

18 голосов
/ 15 сентября 2010

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

Если вы хотите подлинное прямое объявление для переменной, вы должны использовать ключевое слово extern

extern struct A Unit[10];

Это будет работать как в C, так иC ++.Однако, как побочный эффект, это даст Unit внешнюю связь.Если вам нужна переменная с внутренней связью, то вам не повезло в C ++, поскольку в C ++ невозможно объявить переменную с внутренней связью.Между тем предварительные определения в Си все еще помогут вам достичь этого.

1 голос
/ 15 сентября 2010

C позволяет условно объявлять переменные (я думаю).C ++ нет.После определения «Единицы» его нельзя переопределить в той же области действия

0 голосов
/ 18 апреля 2019

Сделать Unit функцией, которая возвращает ссылку на A [10] и в которой фактический массив является статической переменной в функции.

// in hpp file
A[10]& Unit();

// in cpp file
A[10]& Unit() {
    static A[10] value;
    return value;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...