Препроцессор. Заголовочные файлы. Директивы препроцессора

Получение исполняемого кода из исходного текста происходит в несколько этапов: на первом этапе с исходным текстом программы работает специальная программа – препроцессор.

Основная цель препроцессора - закончить форматирование исходного текста программы на С++.

Затем окончательный текст подвергается компиляции.

Замечание:

1. Директива препроцессора пишется каждая на определённой строке.

2. Большинство директив препроцессора можно использовать в любом месте программы, при этом их действия распространяются от того места, где они используются до конца файла.

Список директив препроцессора (все начинаются с #).

# include –включает в исходный текст программы текстовый файл (работает только с исходным кодом)

> - включение происходит из стандартной библиотеки текстовых файлов

“ ” – файл сначала используется в исходном каталоге, а затем в стандартной библиотеке

# define – задаёт макроподстановки и определяет имена для компилятора

# undef – отменяет #define

# if # elif # endif # ifdef # ifndef директивы условной трансляции - позволяют формировать различный код, который поступает к компилятору, что способствует переносимости программы.


# pragma - позволяет настраивать компилятор с учётом специфических особенностей компьютера или ОС.


# error – включается между #if и #endif для проверки какого-либо условия на этапе компиляции. При выполнении такого условия компилятор выдаёт сообщение, указанное в #error, и восстанавливается.

Лучше избегать использование директив препроцессора.

1. #define - задаёт макроподстановку.

-идентификатор_макро

-тело_макро

Препроцессор просматривает исходный текст, заменяет каждое вхождение идентификатор_макро на тело_макро.

#define First 1

{

main ()

If (n== First) // if (n==1)

}

#define False 0

#define True! False

Можно также работать с функциями:

#define SQUARE(x) x*x

main()

int z=2;

y=SQUARE(z+1); //y примет значение 9

#define

Если тело_макро пустое, то идентификатор_макро будет заменён на пробел.

Предопределённые идентификаторы.

_ _cplusplus - исходный текст должен компилироваться как C++, а не C

_ _ DATE_ _ - во время компиляции преобразовывается в строку, заключая в кавычки, содержащую дату компиляции.

_ _FILE_ _ - вместо FILE подставляется строчка с именем файла, с учётом полного пути

_ _LINE_ _ - содержит в себе номер текущей строки

_ _TIME_ _ - время последней компиляции

cout << “Error in”<<_ _FILE_ _ #define

<<”str”<<_ _LINE_ _<<

<<”cur time”<<_TIME_;

Диагностический макрос (микрокоманда) assert.

Макрос assert имеет вид: assert (выражение)

Позволяет программисту отследить не предусмотренные задачей ситуации во время выполнения программы.

assert (x<0)

assertion failed: x<0; file…;

line…….;

2. #undef – отмена использования #define

#define MESSAGE “hello”

cout<<MESSAGE;

#undef MESSAGE

cout<<MESSAGE; // выдаст ошибку

#ifdef MESSAGE

#else

#define MESSAGE “hello”

#endif

#if defined(_Win32)

typedef ind int 32;

#else

typedef long int 32;

#endif

int 32 m=1; // 32 разряда

3. #include – получаем доступ к стандартной библиотеке

#include

std lib user files

general.h general.cpp func1.cpp func2.cpp

#include “general.h” #include “general.cpp” #include “func1.cpp” #include “func2.cpp”


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: