русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Література


Дата добавления: 2015-06-12; просмотров: 579; Нарушение авторских прав


Лекция 17

Тема: Препроцессор

Мета:

 

Література

  1. Джесс Либерти. Освой самостоятельно С++. 3 и-е. М.: Вильямс. – 2000.
  2. Г. Шилдт. Полный справочник по С++. 4 и-е. – М.: Вильямс. – 2003.
  3. Т.А. Павловская. С/С++. Программирование на языке высокого уровня. ПИТЕР-2002
  4. С.В. Глушаков. Практикум по С++. ФОЛИО – 2006
  5. Х. Дейтел, П. Дейтел. Как программировать на С++.
  6. Джесс Либерти. Стандартная библиотека С++. 3 и-е. М.: Вильямс. – 2001.
  7. Ю.Л. Кетков. Введение в языки программирования C и C++
    http://www.intuit.ru/department/pl/ccpp/
  8. А.Л. Фридман. Язык программирования C++
    http://www.intuit.ru/department/pl/cpp/
  9. Б. Страуструп. Язык программирования C++ для профессионалов

http://www.intuit.ru/department/pl/cpp2/

  1. М.В. Свиркин, А.С. Чуркин.Программирование под Windows в среде Visual C++
    http://www.intuit.ru/department/se/pwinviscpp2005/
  2. В.М. Снетков. Практикум прикладного программирования на MFC и C++ в среде VS.NET http://www.intuit.ru/department/se/prmfcv/

 


1.

 
 

Всегда перед запуском компилятора С++ работает препроцессор. Препроцессор ищет и обрабатывает в тексте программы инструкции (директивы) препроцессора, каждая из которых начинается с символа #. Действие каждой из инструкций препроцессора состоит в изменении текста исходного кода. В результате работы препроцессора создается новый исходный файл, причем этот файл – временный, и мы обычно его не видим. Именно этот файл обрабатывает компилятор! Увидеть этот временный файл можно используя специальные ключи компилятора, устанавливая свойства проекта. В VS2005 : Projectà Propertiesà Configurations PropertiesàC/C++àPreprocessoràGenerate Preprocessor File. Просмотреть его содержимое можно обычным текстовым редактором.



2. Директива препроцессора #define определяет замещение строки. Например, запись
#define BIG 512 информирует препроцессор о выполнении замены всех вхождений символов BIG в исходном тексте на 512. Поэтому первый вариант использования #define– объявление имен констант. Такой способ был очень распространен в языке С. В С++ для объявления констант лучше использовать ключевые слова const и enum(для перечислений).

 
 

( DEFINE.HPP ) ( NamedConsts1.cpp ) ( NamedConsts2.cpp )

3.

 
 

Второй вариант использования директивы #define – это просто объявление (определение) препроцессорного имени, например : #define WindowsVersion. (L17_1.cpp )
После этого можно проверить, определено ли это имя или нет помощью директив #ifdef, #ifndef, #else, #endif. Отменить определение препроцессорного имени можно директивой #undef. ( L17_2.cpp ) Такой способ использования #define чаще всего применяется для включения/выключения отладочных операторов программы и разработки нескольких версий одной программы.

4. Объявление препроцессорных имен используется также для защиты от повторноговключения заголовочных файлов (inclusion guards). Так как реальные проекты состоят из множества исходных файлов и классов, то существует опасность включения какого-либо заголовка несколько раз. Поэтому на практике применяют такое объявление ( например для класса Animal ) :
#ifndef ANIMAL_HPP
#define ANIMAL_HPP
< текст заголовочного файла>
#endif

5. Когда программа первый раз включает подобный файл директивой #include “Animal.hpp”,то проверка#ifndef дает истину, программа выполняет определение препроцессорного имени ANIMAL_HPPи включает заголовочный файл.
При повторных включениях проверка #ifndefдает ложь и все содержимое от #ifndefдо #endifпропускается препроцессором.
Имя определителя (ANIMAL_HPP)роли не играет, но по соглашению принято использовать имя заголовочного файла, заменив в нем точку символом подчеркивания. Защиту от повторного включения рекомендуется устанавливать для всех заголовочных файлов. Это впоследствии может сберечь часы, затраченные на отладку программы.
( Main.cpp ) ( Main.ide )

6.

 
 

Директива #define используется также для создания макро функций или макросов. Макрос – символическое имя, образованное с помощью #define, способное принимать аргументы. Дополнительные скобки в макросах нужны для правильной обработки параметров – сложных выражений. ( L17_3.cpp ) **( L10V8.CPP )

7. Макросы в С++ не всегда желательны по следующим причинам :

ü макросы из нескольких строк нужно продолжать через символ \ - это неудобно;

ü макросы могут очень сильно увеличить размер исходного текста;

ü макрос не доступен для отладчиков - его просто уже нет в откомпилированном тексте;

ü макросы не чувствительны к типам.

8. В С++ вместо макросов лучше пользоваться inline-функциями, которые иногда называют встроенными в текст функциями, т.е. компилятор помещает содержимое inline-функции в текст программы, во всех местах, где она вызывается. Поскольку физически вызов функции не производится, то нет потерь во времени, связанных с помещением в стек адреса возврата и параметров функции. ( L17_4.cpp )

9. В препроцессоре С++ предусмотрены две специальные операции для работы со строками в макросах. Оператор преобразования в строку (# ) (stringizing operaror) заменяет все, что за ним следует, строкой в двойных кавычках. Оператор конкатенации (##) (concatenation

 
 

operator) соединяет две строки в одну. ( Concat.cpp )

10. Во многих компиляторах предопределен ряд полезных макросов, например:
__DATE__ – текущая дата; __TIME__ – текущее время; __LINE__ – номер строки программы; __FILE__ – имя файла программы.

11. Макрос assert() – применяется для отладки программы и возвращает истину, если его параметр оценивается как истина, в противном случае выполняет выход из программы или обработку ошибочной ситуации. Мощным средством макроса assert является то, что препроцессор не расширяет его код, если не определено препроцессорное имя DEBUG, т.е. не включен режим отладки программы. (L17_5.cpp)

12. Для получения промежуточных значений результатов выполнения программы (отладочной печати) также удобно применить макросы. ( L17_7.cpp )

13. При разработке классов полезно разработать булевские методы, называемые инвариантами класса, которые выполняют логическую проверку правильности данных объекта. В дальнейшем их можно использовать совместно с макросом assert . ( L17_6.cpp )

14. При разработке больших проектов часто используют уровни отладки. ( L17_8.cpp )

15. Директива #pragma устанавливает в программе нужный Вам режим компиляции.

Вопросы и задания к теме №17 ( Q17.doc)



<== предыдущая лекция | следующая лекция ==>
Алфавитный подход | По дисциплине


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.445 сек.