Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Включение файла директивой #includeСодержание книги
Поиск на нашем сайте
Директива #include предназначена для включения в текст программы содержимого указанного файла. Имя файла в директиве #include можно записать в угловых скобках или в кавычках. В первом случае препроцессор будет искать файл только в заранее определенном месте, чаще всего это подкаталог usr/include каталога, в котором установлена система программирования. Например: #include <stdio.h> Если имя файла записано в кавычках, то препроцессор, как правило, ищет его по указанному пути, начиная от корневого каталога или от текущего каталога в зависимости от того, написан ли полный путь или краткое имя файла. Например: #include "progl.h" #include "/home/khabib/cprogs/include/const.h" #include "projectl2/include/const.h"
Подстановка #define и #undef Мы использовали директиву #define для определения констант примерно так: #define MAX_NUMBER 99999 #define Privet С добрым утром!
Увидев #define, препроцессор станет отыскивать все появления первого написанного в ней слова, MAX_NUMBER, Privet, во всем лежащем ниже директивы тексте файла. Найдя это слово, препроцессор просто подставит вместо него все следующие слова, написанные в директиве, вплоть до символа перевода строки исключительно. Если возникает необходимость записать длинную директиву на нескольких строках, то надо экранировать символ перевода строки, поставив в конце строки обратную наклонную черту: #define LONG_TEXT Эта длинная директива \ продолжается на \ нескольких строках. Препроцессор, подставляя строки, просто выбросит из них каждую пару символов, состоящую из обратной наклонной черты и символа перевода строки. #undef отменяет подстановку указанного в ней слова. После данной директивы препроцессор перестанет делать подстановку строки "С добрым утром!" во всем оставшемся тексте: #undef Privet Действие директивы препроцессора #define не ограничивается подстановкой констант. С ее помощью можно определять макросы. Рассмотрим подробнее эту интересную возможность. Макросы Макрос, в отличие от простой константы, содержит параметры, использующиеся в его расшифровке. Получается выражение, очень похожее на функцию. Например: #define sqr(x) х * х Перед открывающей скобкой не должно быть пробела, иначе она будет понята препроцессором как начало значения константы sgr. Макрос затем можно записывать в программе как обычную функцию: int к = 3 * sqr(2) - 4; В отличие от функции, эта запись не дойдет до компилятора. Препроцессор преобразует ее в строку: int k=3*2*2-4; По этой причине при записи макроса легко допустить ошибку. Запись: z = а * sqr(x + у) - b; будет преобразована в строку: z = a*x + y*x + y-b; Вряд ли это имелось в виду при создании макроса. Чтобы избежать таких ошибок, все члены макроса надо занести в скобки: #define sqr(x) ((х) * (х)) Тогда препроцессор преобразует предыдущее выражение в строку: z = а * ((х + у) * (х + у)) - ь;
Для управления строками в макросах существует 2 оператора - оператор взятия в кавычки(#) и оператор контактенации (##). Оператор # берет в кавычки следуючие за ним символы до очередного пробела, например, если объявить так: #define PRINT(x) cout<< #x то PRINT(a string); равносильно cout<<" a string "; Оператор ## используется для контактенации строк, то есть "склеивания" нескольких строк в одну. Например, у вас есть несколько функций с именами MyFirstFunction(), MySecondFunction(), MyThirdFunction() и т.д. Для их вызова можно определить макрос: #define CALLFUNC(x) My##x##Function() и вызывать функции MyFirstFunction(), MySecondFunction(),MyThirdFunction() и т.д. макросом CALLFUNC CALLFUNC(First); CALLFUNC(Second); У многих компиляторов есть ряд встроенных макросов. Наиболее распостраненные - __DATE__, __TIME__, __LINE__, __FILE__, которые заменяются текущей (на время компиляции) датой, временем, номером строки и именем исходного файла соответственно. Встроенные макросы можно использовать без объявления. Пример: cout<<"Compiled on "<<__DATE__<<" "<<__TIME__; Результат: compiled on Sep 52001 23:49:55
Условная компиляция #ifdef Директива препроцессора #ifdef, записываемая в нескольких вариациях, позволяет передать компилятору те или иные участки программы в зависимости от выполнения некоторого условия. В первой строке встречается одно из трех слов #if, #ifdef или #ifndef, после которого записывается условие. Условие здесь — это какое-то константное выражение. На следующих строках записывается текст программы, который будет передан компилятору при выполнении условия, точнее говоря, если оно отлично от нуля. Затем может идти необязательная часть директивы, начинающаяся со строки со словом #else, после которой записывается текст программы, передаваемый компилятору при невыполнении условия. Невыполнение условия означает, что оно равно нулю. Заканчивается директива словом #endif. Например, следующая директива передает компилятору оператор а = 333, если х не равно —10, или оператор а = 555, если х равно —10: int а; #if X + 10 а = 333; #else а = 555; #endif Следует учитывать, что константа X к этому времени уже должна быть определена. Во второй форме директивы #ifdef записывается константа, предварительно определенная в директиве #define. При этом значение константы не имеет значения, важен сам факт ее определения. Например:
#ifdef i386 #define BUFSIZ 2048 #endif #ifdef i586 #define BUFSIZ 4096 #endif Где-то выше этих строк должно быть сделано определение: #define i386 или: #define i586 Смысл третьей формы #ifndef противоположен. Вот как определяется константа eof в файле stdio.h: #ifndef eof #define eof (-1) #endif В некоторых системах программирования определяется и используется макрос defined(). Вот, например, определение константы null: #if!defined(cplusplus) #define null ((void*)0) #else #define null (0) #endif
|
||||
Последнее изменение этой страницы: 2016-12-11; просмотров: 283; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.40.90 (0.007 с.) |