|
Директивы условной компиляции #if, #elif, #else и #endif ⇐ ПредыдущаяСтр 3 из 3 Директивы условной компиляции применяются для того, чтобы исключить компиляцию отдельных частей программы. Это бывает полезно при отладке или, например, при поддержке нескольких версий программы для различных платформ. Формат директивы #if: #if константное_выражение текст_программы #elif константное_выражение текст программы #elif константное_выражение текст_программы … #else текст_программы #endif Каждой директиве #if в исходном файле должна соответствовать закрывающая директива #endif. Между директивами #if и #endif могут использоваться директивы #elif и не более одной директивы #else. Директива #else, если она есть, должна быть последней директивой перед директивой #endif. Препроцессор проверяет каждое константное_выражение, которое следует за директивой #if или #elif, пока не будет найдено выражение со значением истина (не 0). И компилируется текст_программы, следующий за истинным выражением, до соответствующей директивы препроцессора #elif, #else, #endif. Этот текст_программы может содержать другие директивы препроцессора, начинающиеся со знака #. Если все константные_выражения ложны или отсутствуют директивы #elif, то препроцессор выбирает текст программы после директивы #else. Если к тому же отсутствует и директива #else, то никакой текст не выбирается. Примеры использования директив условной компиляции. 1) условное включение различных версий заголовочного файла #if VERSION == 1 #define INFILE “vers1.h” #elif VERSION == 2 #define INFILE “vers2.h” // и так далее #else #define INFILE “versN.h” #endif #include INFILE 2) временно закомментированный фрагмент кода #if 0 int i, j; double x, y; #endif Наиболее часто в программах используются директивы #ifdef и #ifndef, позволяющие управлять компиляцией в зависимости от того, определен ли с помощью директивы #define указанный в них символ (хотя бы как пустая строка). Примеры использования директив #ifdef и #ifndef. 1) #ifdef SYMBOL // Расположенный ниже код до первого elif, #else, или #endif компилируется, если // SYMBOL определен 2) #ifndef SYMBOL // Расположенный ниже код компилируется, если SYMBOL не определен 3) #ifndef HEADER_INCLUDED // Включение заголовочного myheader.h файла только один раз #include “myheader.h” #define HEADER_INCLUDED #endif проверка определения текстовых имен #define DEMO #define NUMBER 5 #include <stdio.h> int main() { puts(“ Проверка определения DEMO\n”); #ifdef DEMO puts(“ DEMO – определена”); #else puts(“ DEMO – не определена\n”); #endif #ifndef NUMBER puts(“ NUMBER – не определена”); #else printf(“NUMBER определена как %d\n”,NUMBER); #endif } Директива #undef Директива #undef текстовое_имя удаляет самое последнее определение текстового имени. Следовательно, все последующие вхождения текстового имени будут игнорироваться препроцессором. Используется редко, например, для управления условной компиляцией исходной программы совместно с директивой #if или совместно с директивой #define. Примеры использования директивы #undef #define SIZE 200 // Определение SIZE int array1[SIZE]; текст программы #undef SIZE // Отмена определения SIZE #define SIZE 20 // Новое определение SIZE int array2[SIZE]; #define BIG 3 #define HUGE 10 #undef BIG // BIG теперь не определен #define HUGE 20 // HUGE теперь переопределен как 20 #undef HUGE // HUGE снова равен 10 #undef HUGE // HUGE не определен Макроопределения с параметрами Макроопределения (макросы) с параметрами очень похожи на функции. Макрос это лексема, созданная с помощью директивы #define: #define текстовое_имя(список_параметров) текст_подстановки Список_параметров содержит один или более формальных параметров, разделенных запятыми. Не допускаются пробелы между текстовым_именем и открывающей скобкой списка_параметров. Первый пробел завершает имя макроопределения и все, что следует за этим пробелом, считается текстом_подстановки. Макрос принимает параметры подобно обычной функции. Преимущество макроопределений заключается в том, что не нужно беспокоиться о типах переменных (макросы имеют дело с символьными строками, а не с фактическими значениями). По этой же причине рекомендуется каждый аргумент в тексте_подстановки и сам текст_подстановки заключать в круглые скобки. Это будет гарантией того, что элементы будут сгруппированы надлежащим образом при вызове макроса. Примеры использования макросов. 1) #define TWICE(x) ((x)*2) /* Обращение в программе может выглядеть как TWICE(5) или TWICE(1.45), то есть тип переменной не имеет значения. Круглые скобки для x необходимы, чтобы макрос правильно работал, например, при таком обращении TWICE(a+3), без скобок макроподстановка выглядела бы так (a+3*2), и, следовательно, результат вычисления отличался бы от (a+3)*2 */ 2) #define MIN(x,y) ((x)<(y)? (x): (y)) Пример использования макроопределения для доступа к элементу матрицы. С помощью датчика случайных чисел сформировать двумерный массив. Возвести в квадрат каждый элемент массива и полученную матрицу выдать на экран. Размерность матрицы задавать с клавиатуры. #include <stdio.h> #include <stdlib.h> #include <math.h> #define ARRAY(I,J) * (parray+(I)*ny+(J)) int main() { int i,j,nx,ny; int *parray; // Объявление указателя для первого элемента матрицы puts(“Введите размерность матрицы(nx, ny) через пробел”); scanf(“%d %d”, &nx, &ny); parray = new int[nx*ny]; // Выделение памяти для хранения элементов матрицы randomize(); for (i=0; i<nx; i++) for (j=0; j<ny; j++) ARRAY(i,j)=pow(random(10)-5,2); for (i=0; i<nx; i++) { for (j=0; j<ny; j++) printf(“ %d ”, ARRAY(i,j)); printf(“\n”);} delete parray; return 0; } Домашнее задание 1. Вычислить z1=max(x,y), z2=max(2*f,5.0-g). Вычисление оформить в виде макроопределения с параметрами. 2. С помощью датчика случайных чисел задать N чисел (N вводится с клавиатуры). Для каждого числа вычислить его квадрат и куб. Вычисление квадрата и куба оформить в виде макроопределений с параметрами. Вычислительный зал Домашнее задание занятия 1. Дополнительные задачи 1. Ввести с клавиатуры число. Вычислить его абсолютную величину. Вычисление оформить в виде макроопределения. 2. Ввести с клавиатуры 2 числа x и y. Вычислить значение F(x,y): 1, если x,y – числа с одинаковыми знаками F (x,y)= -1, если x,y – числа с разными знаками 0, во всех остальных случаях Вычисление оформить в виде макроопределения. 3. Ввести символ x. Вычислить значение функции F(x) F(x)= 1, если x – знак арифметической операции 0, во всех остальных случаях Вычисление оформить в виде макроопределения. 4. Ввести символ x. Вычислить значение функции F(x) F(x)= 1, если x – знак табуляции ‘t’, пробел или символ перехода на новую строку 0, во всех остальных случаях Вычисление оформить в виде макроопределения. 5. С помощью директивы #define определить три символьных имени. Эти определения сделать в файле с именем definition.h. В исходный текст программы включить файл definition.h. с помощью директивы #include. Проверить определение с помощью директив #ifdef или #ifndef первые два символьных имени, если они были определены как 1 и “Bacia”, определение третьего имени отменить. Вывести на экран соответствующую информацию об именах в начале работы программы и в конце. 6. С помощью датчика случайных чисел сформировать трехмерный массив. Для доступа к элементам массива использовать макрос A(i,j,k). Занятие 10. Вопросы к экзамену будут выданы преподавателем на занятии. Занятие 11. Готовьтесь к экзамену! Удачи! Занятие 12. Постарайтесь сдать экзамен с первого раза! Что делает отдел по эксплуатации и сопровождению ИС? Отвечает за сохранность данных (расписания копирования, копирование и пр.)... Что способствует осуществлению желаний? Стопроцентная, непоколебимая уверенность в своем... Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все... Живите по правилу: МАЛО ЛИ ЧТО НА СВЕТЕ СУЩЕСТВУЕТ? Я неслучайно подчеркиваю, что место в голове ограничено, а информации вокруг много, и что ваше право... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|