Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Включение файла директивой #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 с.)