Директива #ifndef
Директива #ifndef (от англ. "if not defined" - "если не определено")
относится к препроцессору C++ и выполняет условную компиляцию.
Она проверяет, было ли ранее определено указанное имя с помощью
директивы #define. Если имя не определено, то весь код,
находящийся между #ifndef и соответствующей директивой
#endif, включается в компиляцию. Если же имя уже определено,
этот блок кода пропускается препроцессором.
В качестве параметра директива принимает идентификатор (имя макроса),
который нужно проверить. Чаще всего #ifndef используется
для защиты заголовочных файлов от повторного включения
(так называемые include guards), а также для условной сборки
кода под разные платформы.
Синтаксис
#ifndef ИМЯ_МАКРОСА
// код, который компилируется, если ИМЯ_МАКРОСА не определено
#endif
Пример
Давайте проверим, определен ли макрос DEBUG. Так как он
не определен, код внутри блока будет скомпилирован:
#include <iostream>
using namespace std;
int main()
{
#ifndef DEBUG
cout << "Debug mode is off" << endl;
#endif
return 0;
}
Результат выполнения кода:
"Debug mode is off"
Пример
Теперь определим макрос DEBUG с помощью директивы
#define. В этом случае код внутри блока #ifndef
будет пропущен препроцессором:
#include <iostream>
using namespace std;
#define DEBUG
int main()
{
#ifndef DEBUG
cout << "Debug mode is off" << endl;
#else
cout << "Debug mode is on" << endl;
#endif
return 0;
}
Результат выполнения кода:
"Debug mode is on"
Пример
Классический пример использования #ifndef - защита
заголовочного файла от повторного включения. Создадим файл
myheader.h с include guard:
#ifndef MYHEADER_H
#define MYHEADER_H
int square(int x)
{
return x * x;
}
#endif
Теперь этот файл можно подключать через #include
сколько угодно раз - благодаря #ifndef его содержимое
будет включено в компиляцию только один раз:
#include <iostream>
#include "myheader.h"
#include "myheader.h"
using namespace std;
int main()
{
cout << square(5) << endl;
return 0;
}
Результат выполнения кода:
25
Смотрите также
-
директива
#ifdef,
которая проверяет, определено ли имя -
директива
#define,
которая определяет макрос -
директива
#endif,
которая закрывает блок условной компиляции -
директива
#pragma once,
которая защищает заголовок от повторного включения