Препроцессорные директивы

Автор: | 5 августа, 2019

Данные директивы выполняются до компиляции и управляют работой предпроцессора. Данные команды начинаются со знака # и должны быть в начале строки.

Рассмотрим их подробней:

#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