Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Директивы условной компиляции #if, #elif, #else и #endif





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

Постарайтесь сдать экзамен с первого раза!







Что делает отдел по эксплуатации и сопровождению ИС? Отвечает за сохранность данных (расписания копирования, копирование и пр.)...

Что способствует осуществлению желаний? Стопроцентная, непоколебимая уверенность в своем...

Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все...

Живите по правилу: МАЛО ЛИ ЧТО НА СВЕТЕ СУЩЕСТВУЕТ? Я неслучайно подчеркиваю, что место в голове ограничено, а информации вокруг много, и что ваше право...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.