8.2.2. Сопоставление объявлений в разных файлах
8.2.2. Сопоставление объявлений в разных файлах
Одна из проблем, вытекающих из возможности объявлять объект или функцию в разных файлах, – вероятность несоответствия объявлений или их расхождения в связи с модификацией программы. В С++ имеются средства, помогающие обнаружить такие различия.
Предположим, что в файле token.C функция addToken() определена как имеющая один параметр типа unsigned char. В файле lex.C, где эта функция вызывается, в ее определении указан параметр типа char.
// ---- в файле token.C ----
int addToken( unsigned char tok ) { /* ... */ }
// ---- в файле lex.C ----
extern int addToken( char );
Вызов addToken() в файле lex.C вызывает ошибку во время связывания программы. Если бы такое связывание прошло успешно, можно представить дальнейшее развитие событий: скомпилированная программа была протестирована на рабочей станции Sun Sparc, а затем перенесена на IBM 390. Первый же запуск потерпел неудачу: даже самые простые тесты не проходили. Что случилось?
Вот часть объявлений набора лексем:
const unsigned char INLINE = 128;
const unsigned char VIRTUAL = 129;
Вызов addToken() выглядит так:
curTok = INLINE;
// ...
addToken( curTok );
Тип char реализован как знаковый в одном случае и как беззнаковый в другом. Неверное объявление addToken() приводит к переполнению на той машине, где тип char является знаковым, всякий раз, когда используется лексема со значением больше 127. Если бы такой программный код компилировался и связывался без ошибки, во время выполнения могли обнаружиться серьезные последствия.
В С++ информация о количестве и типах параметров функций помещается в имя функции – это называется безопасным связыванием (type-safe linkage). Оно помогает обнаружить расхождения в объявлениях функций в разных файлах. Поскольку типы параметров unsigned char и char различны, в соответствии с принципом безопасного связывания функция addToken(), объявленная в файле lex.C, будет считаться неизвестной. Согласно стандарту определение в файле token.C задает другую функцию.
Подобный механизм обеспечивает некоторую степень проверки типов при вызове функций из разных файлов. Безопасное связывание также необходимо для поддержки перегруженных функций. (Мы продолжим рассмотрение этой проблемы в главе 9.)
Прочие типы несоответствия объявлений одного и того же объекта или функции в разных файлах не обнаруживаются во время компиляции или связывания. Поскольку компилятор обрабатывает отдельно каждый файл, он не способен сравнить типы в разных файлах. Несоответствия могут быть источником серьезных ошибок, проявляющихся, подобно приведенным ниже, только во время выполнения программы (к примеру, путем возбуждения исключения или из-за вывода неправильной информации).
// в token. C
unsigned char lastTok = 0;
unsigned char peekTok() { /* ... */ }
// в lex.C
extern char lastTok;
extern char peekTok();
Избежать подобных неточностей поможет прежде всего правильное использование заголовочных файлов. Мы поговорим об этом в следующем подразделе.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
5.4. Получение информации о файлах
5.4. Получение информации о файлах Чтение каталога для получения имен файлов лишь половина дела. Получив имя файла, нужно знать, как получить остальную информацию, связанную с файлом, такую, как тип файла, права доступа к нему, владельца и
Информация о файлах
Информация о файлах Наиболее универсальным средством получения практически исчерпывающей информации о файлах является команда ls. Однако для этой цели существуют и другие команды.Общая форма запуска команды ls —$ ls [options] names где в качестве аргумента names могут выступать
ФОРУМЫ И ДОСКИ ОБЪЯВЛЕНИЙ
ФОРУМЫ И ДОСКИ ОБЪЯВЛЕНИЙ Помимо электронной почты, которая дает нам возможность общаться с нужным собеседником тет-а-тет, и групп новостей, которые распространяются по каналам все той же электронной почты, в Сети есть такая замечательная вещь, как форумы. Благодаря им
Доски объявлений
Доски объявлений Доска объявлений – это раздел сайта (а иногда и целый сайт), посвященный объявлениям посетителей и позволяющий как читать, так и размещать сообщения. Как правило, доски объявлений структурированы на разделы и подразделы. Их использование в подавляющем
Доски объявлений
Доски объявлений Досок объявлений, посвященных предложениям работы, в Интернете великое множество. Как правило, они структурированы и состоят из двух основных частей: Вакансии и Резюме. После того как вы зайдете в раздел Вакансии, вам будет предложен на выбор список
5.2 Немного о файлах и каталогах
5.2 Немного о файлах и каталогах Чуть подробней я остановлюсь на вопросах работы с файлами и каталогами в Ubuntu после установки. Пока же хочу лишь упомянуть о двух немаловажных особенностях этой системы: во-первых, как вы может быть уже догадались, разделителем каталогов в
Форумы и специализированные доски объявлений
Форумы и специализированные доски объявлений По сути – те же чаты, но утратившие львиную долю своей дикости и хаотичности. Общение здесь происходит уже в «отложенном» режиме, так что есть время подумать над ответами. Да и анонимности на форумах поменьше. Кроме того,
Доски бесплатных объявлений
Доски бесплатных объявлений Почти каждому человеку время от времени приходятся давать те или иные объявления. Один ищет работу, другой – спутника жизни, кому-то надо что-то продать или купить, кто-то разменивает квартиру, и т.д. Если раньше подобные объявления давались
Аукционы и доски объявлений
Аукционы и доски объявлений В Интернете существует огромное количество различных барахолок, на которых продается все! По самым разным ценам. Как по совсем бросовым, так и по заоблачным. Попробуйте набрать в поисковике барахолка. Вы будете поражены результатами поиска.
Форма объявлений
Форма объявлений Отточим наши критические навыки вначале на чем-либо не столь существенном. Поэтому начнем с синтаксиса. Рассмотрим нотацию, используемую при объявлении компонентов. В отличие от многих языков мы не использовали для подпрограмм ключевых слов procedure или
Способы изменения объявлений
Способы изменения объявлений Возможность изменить объявление компонента - переопределить или дать его реализацию - обеспечивает гибкость и последовательное проведение разработки. Имеется еще два метода, усиливающих эти качества:[x]. Возможность изменить объявление
Что нужно знать о файлах?
Что нужно знать о файлах? В современных компьютерах на жестких дисках, а также на других накопителях и носителях информации обычно находится одновременно много различных данных, представленных в двоичном коде. Для доступа к информации (например, чтобы прочитать текст,