Начнем с простых переменных. Допустим, у нас есть два модуля: А.срр и В.срр. В модуле А определена целая переменная i вне всех классов и функций:
int i = 2;
Такая переменная называется глобальной. В файле А она видна от точки определения и до конца файла. Однако в модуле В эта переменная не видна. И если вдруг нам потребуется в модуле В присвоить ей другое значение, у нас возникнут некоторые проблемы. Нельзя просто написать:
1 = 1:
В этом случае компилятор при обработке модуля В «не видит» модуль А и ничего не знает об определенной там переменной, поэтому мы получим сообщение о неопределенной переменной. Также нельзя написать:
int i = 1;
Такая запись является повторным определением. Компилятор-то «возражать» не станет — он транслирует модули по отдельности, а вот компоновщик будет «воротить нос» и сообщит, что одна и та же переменная определена дважды. Для таких случаев в С++ включено специальное ключевое слово extern. В модуле В надо объявить переменную следующим образом:
extern int i;
После этого можно использовать переменную i в файле В любым разрешенным способом. Например, присвоить новое значение:
i = 1;
Однако попытка совместить объявление с присвоением значения является ошибкой:
extern int i = 1;
Такая запись служит определением, поэтому мы опять получим от компоновщика сообщение о повторном определении. ПРИМЕЧАНИЕ
Хотя ключевое слово extern в стандарте определено как один из четырех классов хранения, проще понимать его как обозначение «внешнего» имени для данного модуля. Имя называется внешним по отношению к модулю, если объект с этим именем не определен в данном модуле.
Аналогичная картина наблюдается и с функциями. Определение функции включает тело, а объявлением является прототип. Пусть в модуле А определена функция:
void f(void) { cout << "f()" << endl; }
Для того чтобы эту функцию можно было использовать в модуле В, нужно объявить там ее прототип:
void f(void);
Слово extern писать не требуется, хотя и не запрещается. Следующие прототипы эквивалентны:
void f(void); extern void f(void);
Опубликовал Kest
January 23 2014 11:44:24 ·
2 Комментариев ·
4199 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Павел January 23 2014 18:21:11
Вот за что я в начале не полюбил с++. Этим он и труден в изучении благодаря вот таким вещам.
Хотя с другой стороны в с++ этот механизм реализован более логически, чем в других языках, например в том же pascal.
Я даже заметил, что когда начинаешь объявлять все прототипы внешние переменные и так далее, код становиться более понятен, особенно по своей структуре, если смотреть с "далека".
Виктор January 24 2014 15:06:08
Скажу я вам, что в c++ межмодульное взаимодействие через переменные и функции реализовано крайне логично и практично.
Я изучал не один язык, но только в c++ я увидел такие слаженные переходы.
Вся структура данного языка изначально писалась под профессиональных программистов и от того тут все слаженно и с умом. Лучший язык программирования... имхо.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.