Программирование >>  Инициализация объектов класса, структура 

1 ... 122 123 124 [ 125 ] 126 127 128 ... 395


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- объявление не выделяет места под объект. Оно может встретиться несколько раз в одном и том же исходном файле или в разных файлах одной программы. Однако обычно находится в общедоступном заголовочном файле, который включается в те модули, где



1 ... 122 123 124 [ 125 ] 126 127 128 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика