Большинство директив препроцессора можно использовать в любом месте программы, при этом их действия распространяются от того места, где они используются до конца файла.
Список директив препроцессора (все начинаются с #).
# 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 – получаем доступ к стандартной библиотеке