#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 предварить оператором отрицания (!), и тогда условная компиляция будет выполнена в случае, если заданное имя макроса не определено. |
Нет комментариев. Оставить комментарий: |