Там разница между декларации и определения. extern in i;
- это объявление: в нем указано, что существует переменная с именем i
, тип которой int
, и подразумевает, что она будет определена где-то в другом месте. int i;
, с другой стороны, является определением переменной i
. Когда вы пишете определение, он сообщает компилятору создать эту переменную. Если у вас есть определения одной и той же переменной в более чем одном исходном файле, у вас есть несколько определений, и компилятор (ну, на практике, компоновщик) должен жаловаться. Вот почему определение S tool;
в заголовке создает проблемы: каждый исходный файл, который содержит этот заголовок, содержит , определяющийtool
, и компилятор правильно жалуется.
Разница между const
и not- const
определения, как вы говорите, что const int i = 3;
определяет переменную с именем i
что локальный в файл компилируется. Нет проблем с тем же определением в более чем одном исходном файле, потому что у этих парней есть внутренняя связь , то есть они не видны за пределами исходного файла. Если у вас нет const
, например, с int i = 3;
, который также определяет переменную с именем i
, но она имеет внешнюю связь , что она видна вне исходного файла и имеет одинаковое определение в нескольких файлах. вы эта ошибка. (технически это определения с таким же именем, что приводит к проблемам: int i = 3;
и double i = 3.0;
в двух разных исходных файлах по-прежнему являются повторяющимися определениями).
Ваша проблема не в переменной, а в файле заголовка. –
Попробуйте использовать в начале h-файла: #pragma once –
У меня уже есть защита заголовка – markzzz