Препроцессор. Заголовочные файлы. Директивы препроцессора.
Получение исполняемого кода из исходного текста происходит в несколько этапов: на первом этапе с исходным текстом программы работает специальная программа – препроцессор.
Основная цель препроцессора - закончить форматирование исходного текста программы на С++.
Затем окончательный текст подвергается компиляции.
Замечание:
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”