Спецификатор extern

Сишник 18.03.2004 - 13:07 | Имеется некоторый прокт в VC. В нескольких файлах объявляю extern int i; Компилируется всё нормально, линковщик ругается в одном месте что переменная i уже определена в неком .obj и фиксирует ошибку. Если в одном из файлов убираю этот extern - уже не проходит компилятор. Что это может значить ?
Nex 1 - 18.03.2004 - 13:39 | если в нескольких файлах написано extern, а просто int i нигде не написало, то должна быть ошибка линкера unresolved external symbol если в одном месте (!) объявлена переменная, в других - только внешние ссылки, то всё должно быть нормально. "уже не проходит компилятор" - а что он выдаёт? ~ совет: попробуй нажать ребилд олл
Сишник 2 - 18.03.2004 - 16:44 | если я уберу хотя бы из одного места extern int i, то компилятор проссто ругается что переменная i не определена. Определение int i в одном \месте есть, с этим всё ок. А вообще к переменной как к extern можно из любого файла проекта обращаться ? И определение без спецификатора extern может где угодно располагаться ?
Nex 3 - 18.03.2004 - 17:08 | > А вообще к переменной как к extern можно > из любого файла проекта обращаться ? да ~ > И определение без спецификатора extern может где угодно располагаться ? да, только один раз. чтобы использовать такую же (== эту же) переменную в других модулях, надо в них писать то же объявление, но с extern
Сишник 4 - 18.03.2004 - 17:25 | Опять у меня сходная проблема ... обзявляю в классе (имеющем предков и потомков) статическую переменную static int i в открытой (публик) части. Далее обрашаюсь к ней из наследующего класса как CLASSNAME::i.. Линковщик ругается на эту переменную как на Unresolved External !!! Ну что за напасть - всё делаю по правилам и такая фигня происходит !!!
Сергей 5 - 18.03.2004 - 17:30 | Ты делаешь по правилам, но не все :) Кроме объявления в классе ты должен в .cpp сделать "реализацию" статических данных. Например так: int CLASSNAME::i;
Сишник 6 - 18.03.2004 - 17:34 | [5] - а зачем это и где это надо поместить ?
Сергей 7 - 18.03.2004 - 17:38 | Про где поместить, цитирую: "Кроме объявления в классе ты должен в .cpp сделать "реализацию" статических данных." Работает это по аналогии с "просто" статическими переменными - объявление в классе это "объявление с extern"; необходимо, чтобы где-то было "просто, без extern".
Сишник 8 - 18.03.2004 - 17:46 | Странно как - то ... реализация для переменных класса ...
Сергей 9 - 18.03.2004 - 17:55 | А что странного? Когда данные не статические - они хранятся в памяти вместе с экземплярами классов. А где компилятор должен хранить статические данные класса? Если ты не укажешь, в какой именно единице трансляции ты хочешь разместить статическую переменную, куда компилятор должен ее "сунуить"? Не забывай, что С++ поддерживает раздельную трансляцию, и "пусть компилятор поместит статические данные класа данные куда-нибудь" - не подходит. Да и .h-файл с объявлением класса обычно включается во много разных .cpp-файлов...
UE 10 - 18.03.2004 - 17:56 | Что странного-то? Обычные нестатические переменные класса инициализируются при создании объекта, а статические уж будь добр в явном виде реализовать.

>>