Данные директивы выполняются до компиляции и управляют работой предпроцессора. Данные команды начинаются со знака # и должны быть в начале строки.
Рассмотрим их подробней:
#define
Данная директива заменяет обозначенный идентификатор на последовательность символов который определен в идентификаторе
Например:
#define NULL 0
Везде где будет встречаться идентификатор NULL будет происходит подстановка символа 0
Также можно задать многострочный макрос с использованием символа , что бы сообщить препроцессору что макрос не завершен
Например:
#define MAX(x, y) ((x) > (y) ? (x) : (y)) int value = MAX(1,4); // Без использования предпроцессорного макроса выглядело бы это так: int value = ((1) > (4) ? (1) : (4));
#undef
Отменяет обозначение ранее объявленного идентификатор методом #define
Например:
#undef NULL
И объявим новое обозначение
#define NULL 1
Теперь при компиляции если ранее было где объявлен идентификатор NULL будет использоваться новое обозначение. При переназначении уже заданного идентификатор компилятор выдаст предупреждение об переназначение
#error
Позволяет задать сообщение об ошибке во время компиляции
Например:
#if !defined(NULL) #error NULL not set #endif
Если идентификатор NULL не установлен при компиляции появится ошибка
#include
Позволяет подключать текст других файлов в файле вызова
Например:
#include <QDebug>
Появится возможность использования метода qDebug() так как теперь объявлен этот метод
Данная директива используется с следующей спецификой:
Для системных библиотек вызывается методом #include <имя файла>
Для пользовательских #include “имя файла.h ”
Данная возможность упрощает поиск файлов предпроцессора
Условные директивы #if, #ifdef, #else, #endif
Данные директивы задают условие выполнение и позволяют определить компилируемые участки кода
Рассмотрим несколько примеров:
Условие if и else
#if NULL // выполнение если NULL = 1 #else // выполнение если NULL = 0 #endif // Проверка установленного значение #ifndef WIN32 #error "Поддерживается только в WIN32" #endif