|
Программирование >> Инициализация объектов класса, структура
int ix = 1024; int ix() ; void func( int ix, int iy ) { int ix = 255; if (int ix=0) { int ix = 79; int ix = 89; else { int ix = 99; Упражнение 8.2 К каким объявлениям относятся различные использования переменных ix и iy в int ix = 1024; void func( int ix, int iy ) { ix = 100; for( int iy = 0; iy < 400; iy += 100 ) { iy += 100; ix = 300; iy = 400; следующем примере: 8.2. Глобальные объекты и функции Объявление функции в глобальной области видимости вводит глобальную функцию, а объявление переменной - глобальный объект. Глобальный объект существует на протяжении всего времени выполнения программ:. Время жизни глобального объекта начинается с момента запуска программы и заканчивается с ее завершением. Для того чтобы глобальную функцию можно было вызвать или взять ее адрес, она должна иметь определение. Любой глобальн1й объект, используем1й в программе, должен быть определен, причем только один раз. Встроенные функции могут определяться несколько раз, если только все определения совпадают. Такое требование единственности или точного совпадения получило название правила одного определения (ПОО). В этом разделе мы покажем, как следует вводить глобальные объекты и функции в программе, чтобы ПОО соблюдалось. 8.2.1. Объявления и определения Как было сказано в главе 7, объявление функции устанавливает ее имя, а также тип возвращаемого значения и список параметров. Определение функции, помимо этой объявление функции calc() определение находи, void calc(int); int main() ункции calc() находится в другом файле int loc1 = get(); ошибка: get() не объявлена calc(loc1); правильно: calc() объявлена ... Функция должна быть объявлена перед вызовом. Например: type specifier object name; Определение объекта имеет две формы: type specifier object name = initializer; Вот, например, определение obj1. Здесь obj1 инициализируется значением 97: int obj1 = 97; Следующая инструкция задает obj2, хотя начальное значение не задано: int obj2; Объект, определенный в глобальной области видимости без явной инициализации, гарантированно получит нулевое значение. Таким образом, в следующих двух примерах int var1 = 0; и var1, и var2 будут равны нулю: int var2; Глобальный объект можно определить в программе только один раз. Поскольку он должен быть объявлен в исходном файле перед использованием, то для программы, состоящей из нескольких файлов, необходима возможность объявить объект, не определяя его. Как это сделать? С помощью ключевого слова extern, аналогичного объявлению функции: оно указывает, что объект определен в другом месте - в этом же исходном файле или в другом. Например: extern int i; Эта инструкция обещает , что в программе имеется определение, подобное int i; информации, задает еще и тело - набор инструкций, заключенных в фигурные скобки. заголовочн файл extern int obj1; extern int obj2; исходн файл int obj1 = 97; необходимо использовать глобальный объект: int obj2; Объявление глобального объекта с указанием ключевого слова extern и с явной инициализацией считается определением. Под этот объект выделяется память, и другие extern const double pi = 3.1416; определение определения не допускаются: const double pi; ошибка: повторное определение pi Ключевое слово extern может быть указано и при объявлении функции - для явного обозначения его подразумеваемого см1сла: определено в другом месте . Например: extern void putValues( int*, int ); 8.2.2. Сопоставление объявлений в разных файлах Одна из проблем, вытекающих из возможности объявлять объект или функцию в разных файлах, - вероятность несоответствия объявлений или их расхождения в связи с модификацией программы. В С++ имеются средства, помогающие обнаружить такие различия. Предположим, что в файле token.C функция addToken() определена как имеющая один параметр типа unsigned char. В файле lex.C, где эта функция вызывается, в ее ---- в файле token.C ----int addToken( unsigned char tok ) { /* ... */ } ---- в файле lex.C ----определении указан параметр типа char. extern int addToken( char ); Вызов addToken() в файле lex.C вызывает ошибку во время связывания программы. Если бы такое связывание прошло успешно, можно представить дальнейшее развитие событий: скомпилированная программа была протестирована на рабочей станции Sun Sparc, а затем перенесена на IBM 390. Первый же запуск потерпел неудачу: даже самые простые тесты не проходили. Что случилось? Вот часть объявлений набора лексем: extern- объявление не выделяет места под объект. Оно может встретиться несколько раз в одном и том же исходном файле или в разных файлах одной программы. Однако обычно находится в общедоступном заголовочном файле, который включается в те модули, где
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |