Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Лафоре Р. -> "Объектно-ориентированное программирование в С++" -> 226

Объектно-ориентированное программирование в С++ - Лафоре Р.

Лафоре Р. Объектно-ориентированное программирование в С++ — М.: Питер, 2004. — 992 c.
Скачать (прямая ссылка): obektnoorentprogramm2004.djvu
Предыдущая << 1 .. 220 221 222 223 224 225 < 226 > 227 228 229 230 231 232 .. 341 >> Следующая


Всего лишь одна команда требуется компилятору, чтобы откомпилировать все исходные и заголовочные файлы, скомпоновать .LIB и .OBJ файлы и создать исполняемый .ЕХЕ-файл. Это называется процессом сборки.

Одно из замечательных свойств проектов — они хранят данные о том, когда был откомпилирован каждый исходный файл. Перекомпилируются только те файлы, которые были изменены после последней сборки. Это определяется автоматически и позволяет ощутимо сэкономить время на компиляцию, что особенно заметно при сборке больших проектов. Некоторые компиляторы различают обычную сборку и сборку с перекомпиляцией измененных модулей. Обычная сборка перекомпилирует все файлы, независимо от даты внесения последних изменений.

Межфайловое взаимодействие

В многофайловых программах элементы, хранящиеся в разных файлах, должны каким-то образом сообщаться друг с другом. В этом разеделе мы выясним, как это делается. Вначале мы обсудим, как сообщаются откомпилированные по отдельности, но скомпонованные вместе исходные файлы (.СРР), а затем — как обращаться с заголовочными (.Н) файлами.

Взаимодействие исходных файлов

Давайте рассмотрим, как сообщаются между собой отдельные исходные файлы. Мы обратим внимание на три основных элемента: переменные, функции и клас- Межфайловое взаимодействие 599 .

сы. Для каждого из них есть свои правила межфайлового взаимодействия. В этом месте полезно будет вспомнить о понятии зоны действия, для этого придется вернуться ненадолго к главе 5. Зона действия (или зона видимости) — это часть программы, внутри которой к данной переменной или другому элементу программы имеется доступ. Так, элементы, объявленные внутри функции, имеют локальную зону видимости, то есть доступ к ним может осуществляться только из данной функции. Соответственно, компоненты класса видны только внутри класса (кроме случаев использования оператора явного задания).

Элементы программы, объявленные вне всех функций и классов, имеют глобальную зону видимости, то есть доступ к ним осуществляется из любого места файла исходного текста программы. Как мы сейчас увидим, из других файлов того же проекта глобальные переменные тоже видны. ,

Межфайловые переменные

Начнем с простых переменных. Для этого вспомним разницу между объявлением и определением. Мы объявляем, декларируем какую-то простую переменную, задавая ее тип и имя. Это не означает, что для нее сразу же резервируется место в памяти. Объявление переменной просто сообщает компилятору о том, что где-либо там, в программе, может встретиться переменная с таким-то именем и такого-то типа. Переменная определяется, когда под нее в памяти резервируется место, которое способно содержать любое ее значение. Определение, так сказать, создает реальную переменную.

Большинство объявлений являются также и определениями. Точнее, единственным объявлением простой переменной, не являющимся определением, является объявление с использованием зарезервированного слова extern (без инициализации):

int SomeVar; //объявление и определение в одном флаконе

extern int someVar: //только объявление

Можно догадаться, что глобальная переменная может быть определена только один раз во всей программе, независимо от того, из скольких файлов она состоит.

//файл А

int globalVar: //определение в файле А //файл В

int globalVar; //как НЕЛЬЗЯ делать: то же определение в //файле В

Конечно, такие строгости касаются только глобальных переменных. Если переменные являются локальными по отношению к каким-либо классам или функциям, то вы можете сколько душе угодно определять одни и те же переменные с одинаковыми именами и типами данных. Не забудьте только разнести их по разным зонам видимости. Но лучше, конечно, вообще так не делайте — переменные с одинаковыми именами ничего, кроме сумятицы, в программу не вносят.

Как же обеспечить доступ к глобальным переменным, находящимся в одном файле, из другого? Тот факт, что компоновщик будет воротить нос при попытке 602

Глава 13. Многофайловые программы

определения одной и той же глобальной переменной в разных файлах, еще не означает, что она будет отовсюду видна. Все-таки переменную нужно объявлять во всех файлах, в которых она используется. Например, такой вариант не подходит:

//файл А

int globalVar: //Определение в файле А //файл В

globalVar=3: //НЕЛЬЗЯ! globalVar тут никто не знает

Компилятор справедливо заметит, что globalVar — неидентифицированный идентификатор.

Чтобы то, что мы так рекламировали в начале этого пункта, было действительно правдой, то есть чтобы переменная, определенная в одном файле, была видна в другом, нужно объявлять ее во всех остальных файлах с помощью зарезервированного слова extern.

//файл А ' ' "'*

int globalVar; //Определение в файле А //файл В

extern int globalVar; //Объявление в файле В . ^jr.„j

globalVar = 3; //Вот теперь все хорошо

Как вы уже, наверное, догадались, объявление глобальной переменной в файле А сделало ее видимой в файле В. Зарезервированное слово extern означает, что объявление в данном случае — это только объявление, ничего более. Оно просит компилятор, который в каждый момент времени видит только один файл, не обращать внимание на то, что переменная globalVar не определена в файле В. Компоновщик, который с высоты своего особого статуса обозревает все файлы проекта, позаботится об установке ссылки на переменную, не определенную в данном файле.
Предыдущая << 1 .. 220 221 222 223 224 225 < 226 > 227 228 229 230 231 232 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100