Справочник по C/C++
#if, #ifdef, #ifndef, #else, #elif и #endif

Директивы #if, #ifdef, #ifndef, #else, #elif и #endif используются для избирательной компиляции различных фрагментов программы. Главная идея состоит в том, что если выражение, стоящее после директив #if, #ifdef и #ifndef, оказывается истинным, то будет скомпилирован код, расположенный между одной из этих трех директив и директивой #endif; в противном случае данный код будет опущен. Директива #endif используется для обозначения конца блока #if. Директиву #else можно использовать с любой из перечисленных выше директив для предоставления альтернативного варианта компиляции.

Общая форма записи директивы #if выглядит так.

#if константное_выражение

Если константное выражение является истинным, будет скомпилирован код, расположенный непосредственно за этой директивой.

Общая форма записи директивы #ifdef такова.

#ifdef имя_макроса

Если имя_макроса определено в операторе #define, то будет скомпилирован блок кода, следующий за оператором #ifdef.

Общая форма записи директивы #ifndef такова.

#ifndef имя_макроса

Если имя_макроса не определено в операторе #define, то будет скомпилирован блок кода, следующий за оператором #ifndef.

Вот пример совместной работы некоторых директив препроцессора.

#define ted 10

///...

#ifdef
	ted cout << "Привет, Тэд\n";
#endif
	cout << "Привет, Джон\n";
#if 10<9
	cout << "Привет, Жорж\n";
#endif

В результате выполнения этого фрагмента программы на экран будут выведены фразы "Привет", "Тэд" и "Привет, Джон", а фраза "Привет, Жорж" - нет.

Директива #elif используется для создания оператора if-else-if. Его общая форма имеет такой вид.

#elif выражение_константа

Для обработки сразу нескольких альтернатив можно использовать ряд директив #е1if.

С помощью директив #if и #elif и оператора предпроцессорной обработки defined можно также выяснить, определено ли имя конкретного макроса директивой препроцессора define. Для этого используется следующая общая форма записи.

#if defined имя_макроса
последовательность_операторов
#endif

Если имя_макроса определено, последовательность_операторов будет скомпилирована. В противном случае она будет опущена. Например, в следующем фрагменте условный оператор компилируется, поскольку имя макроса DEBUG определено в программе.

#define DEBUG
//...
int i=100;
//...
#if defined DEBUG
	cout << "Значение переменной i равно: " << i << endl;
#endif

Можно также оператор defined предварить оператором отрицания (!), и тогда условная компиляция будет выполнена в случае, если заданное имя макроса не определено.






Нет комментариев.



Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: