РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
36 of 815 menu

Директива #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,
    которая защищает заголовок от повторного включения
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить