Директивы препроцессора С
Операторы препроцессора С
Директива define
Директива define
Директива undef
Директива include
Директивы условной компиляции
Конструкции условной компиляции
Конструкции условной компиляции
Конструкции условной компиляции
Пример условной компиляции
Пример условной компиляции. Результат
Пример условной компиляции Защита от повторного включения
Оператор defined
Директива define Макроопределения с параметрами
Макроопределения с параметрами. Моделирование двумерного массива
Макроопределения с параметрами. Моделирование двумерного массива
Макроопределения с параметрами. Моделирование двумерного массива
Операторы # и ##
Операторы # и ## Примеры
Стандартные заголовочные файлы С
2.20M
Категория: ПрограммированиеПрограммирование

Препроцессор Си. Директивы и операторы препроцессора Си

1. Директивы препроцессора С

* Директивы препроцессора С
#define - определение макроса или препроцессорного
идентификатора;
#undef - отмена определения макроса или идентификатора
(препроцессорного);
#include - включение текста из файла;
#if - проверка условия-выражения;
#ifdef - проверка определенности идентификатора;
#ifndef - проверка неопределенности идентификатора;
#else - начало альтернативной ветви для #if;
#elif - составная директива #else/#if;
#endif - окончание условной директивы #if;
#line - смена номера следующей ниже строки;
#error - формирование текста сообщения об ошибке трансляции;
#pragma - действия, предусмотренные реализацией;
#
- пустая директива.

2. Операторы препроцессора С

* Операторы препроцессора С
defined - проверка истинности препроцессорного операнда;
##
- конкатенация препроцессорных лексем;
#
- преобразование операнда в строку символов
ПРИМЕР
#pragma optimize (" [ Оптимизация-List ] ", { On | Off } )
Примечания
Директива pragma optimize должна находиться за пределами
функции. Вступает в силу в первой функции, определенной после того, как
будет показана директива pragma. Параметры включения
и отключения аргументов, заданные в списке оптимизация — on или OFF.
Оптимизация-список может быть равен нулю или большему числу
параметров, приведенных в следующей таблице.
Параметры директивы #pragma optimize
Параметры Тип оптимизации
g Включить глобальную оптимизацию.
s или t Указывать короткую или быструю последовательность машинного
кода.
y Создавать указатели фреймов в стеке программы
Замечание- для MS Visual Studio

3. Директива define

* Директива define
Простая подстановка – макро без параметров
#define идентификатор строка_замещения
Пример 1:
#include <stdio.h>
#include <locale.h>
#define STRING "\n \"Game Over!\" \
Игpa зaкoнчeнa!"
int main( )
{
setlocale(LC_ALL,".1251");
printf(STRING);
return 0;
}
Пример 2://Цепочка подстановок
#define N 100
#define PRINT_N printf("\n Hoмep элeментa=%d·", N);
Результат 2:
PRINT_N; ==> печать : Номер элемента=значение_номера

4. Директива define

* Директива define
Определение идентификатора как препроцессорного
#define идентификатор
Пример 1:
#define A

5. Директива undef

* Директива undef
Отмена определения идентификатора как препроцессорного
#undef идентификатор
Пример 1:
#define A
#define B 10
#define C “С”
#define B ‘C’ //Warning
//Правильно
#undef В
#define B ‘C’ //ОК

6. Директива include

* Директива include
Включение в программу С текстов из файлов
1. #include < имя_фаила > /* Имя в угловых скобках */
2. #include "имя_файла" /* Имя в кавычках */
3. #include имя_макроса
#define MyLib C:\\LIBRARY\mylib.h #define MyLib “C:\LIBRARY\mylib.h”
#define Library(x) L(x)
#define L(x) #x
#include Library(MyLib)
int main()
{
f();
return 0;
}
#include MyLib

7. Директивы условной компиляции

* Директивы условной компиляции
1. Заголовки условных препроцессорных директив
#if
целочисленное_константное_выражение
#ifdef идентификатор
#ifndef идентификатор
2. Препроцессорные директивы альтернативных ветвей
2.а Условная альтернатива
#elif целочисленное_константное_выражение
2.в Безусловная альтернатива
#else
3. Препроцессорная директива окончания условного
диапазона
#endif

8. Конструкции условной компиляции

* Конструкции условной компиляции
// В конструкциях вместо #if можно использовать другой
//заголовок – #ifdef, #ifndef
1. Безальтернативная
#if выражение
текст_1
#endif
2. Простая альтернатива
#if выражение
текст_1
#else
текст_2
#endif

9. Конструкции условной компиляции

* Конструкции условной компиляции
3. Мультиветвления
#if выражение_1
текст_1
#elif выражение_2
текст_2
#elif выражение_3
текст_3
.
.
.
#elif выражение_N
текст_N
#endif

10. Конструкции условной компиляции

* Конструкции условной компиляции
4. Вложенные
#if выражение_1
текст_1
#if выражение_2
текст_2
#if выражение_3
текст_3
.
#else
текст_N
#endif
#endif
.
#endif
//Каждый заголовок должен иметь свой #endif !!!

11. Пример условной компиляции

* Пример условной компиляции
#include <stdio.h>
#define A
#define B 1
#define C 0
int _main( )
{int I=1;
#if I
printf("Int I =%d /n",I);
#else
printf("I is not preprocessor token\n");
#endif
#ifdef A
#ifndef B
printf("A is preprocessor token, B is not preprocessor token\n");
#else
printf("A is preprocessor token, B is preprocessor token\n");
#endif
#endif
#if B
printf("B is preprocessor token not equal 0 \n");
#endif
return 0;}

12. Пример условной компиляции. Результат

* Пример условной компиляции. Результат

13. Пример условной компиляции Защита от повторного включения

* Пример условной компиляции Защита от
повторного включения
file1.c
#ifndef _FILE_NAME
#include "filename.c"
#define _FILE_NAME
#endif
file2.c
#ifndef _FILE_NAME
#include "filename.c"
#define _FILE_NAME
#endif
file.c
#include "file1.c"
#include "file2.c"
Здесь _FILE_NAME - зарезервированный за filename.c файлом
препроцессорный идентификатор

14. Оператор defined

* Оператор defined
Назначение: Используется в препроцессорных условных заголовках
или препроцессорных условных альтернативах для формирования
целочисленного константного значения- признака принадлежности к
препроцессорной define-лексеме
Синтаксис:
defined операнд
Операнд - либо идентификатор, либо заключенный в скобки
идентификатор, либо обращение к макросу
Пример:
Вариант 1
#ifdef Y
#ifndef N
_текст
#endif
#endif
Вариант 2
#if defined Y && !defined N
_текст
#endif

15. Директива define Макроопределения с параметрами

* Директива define
Макроопределения с параметрами
Определение макро с параметрами
#define имя_макроса(список_параметров) строка_замещения
Вызов макро с параметрами
имя_макроса(список_фактических_параметров)
Пример:
#define max(x,y) (x>y)?(x):(y)
#define abs(x) (x<0)?(-x):(x)

16. Макроопределения с параметрами. Моделирование двумерного массива

* Макроопределения с параметрами.
Моделирование двумерного массива
Дано: одномерный массив 12 элементов
X[0] X[1] X[2] X[3] X[4] X[5] X[6] X[7] X[8] X[9] X[10] X[11]
Требуется:
Сформировать двумерный массив А(L1,L2) на основе одномерного массива X построчно.
Число строк = L1 = 3, число столбцов = L2 = 4
Начальные значения индексов должны равняться 1.
Решение:
X[0] X[1] X[2] X[3] – 1-я строка
X[4] X[5] X[6] X[7] – 2-я строка
X[8] X[9] X[10] X[11] – 3-я строка
X[0] =A(1,1) X[1] = A(1,2) X[2] = A(1,3) X[3] = A(1,4)
X[4] =A(2,1) X[5] = A(2,2) X[6] = A(2,3) X[7] = A(2,4)
X[8] =A(3,1) X[9] = A(3,2) X[10] = A(2,3) X[11] = A(2,4)
Индекс вектора X равен номеру строки матрицы A умноженному на количество элементов
в строке – т.е. на число столбцов, плюс номер текущего элемента в строке. Поправка на
-1.
Вывод: формула пересчета индексов имеет вид:
A(i,j) = X[L2*(i-1)+(j-1)]
L2 – число элементов в строке матрицы- число столбцов

17. Макроопределения с параметрами. Моделирование двумерного массива

* Макроопределения с параметрами.
Моделирование двумерного массива
#define L1 4 /* число строк матрицы */
#define L2 5 /* число столбцов матрицы */
#define A(i,j) x[L2*(i-1) + (j-1)]
#include <stdio.h>
void main( )
{
/* определение одномерного массива */
int x[L1*L2];
int i , j , k;
for (k=0; k < L1*L2; k++)
x[k]=k;
for (i=1; i<=L1; i++) /* перебор строк */
{
printf ("\n string %d:", i);
/* Перебор элементов строки */
for (j=1; j<=L2; j++) printf("%d \t",A(i,j));
printf(“\n”); }
}

18. Макроопределения с параметрами. Моделирование двумерного массива

* Макроопределения с параметрами.
Моделирование двумерного массива

19. Операторы # и ##

* Операторы # и ##
Назначение #, ##:
Изменение операнда/ов в строке замещения директивы #define
# - префиксный унарный оператор формирования строкового литерала
из операнда в строке замещения
#op --> “op”
## - инфиксный бинарный оператор конкатенации операндов в строке
замещения
op1##op2 --> op1op2

20. Операторы # и ## Примеры

* Операторы # и ## Примеры
1.
#defiпe print (A) printf(#A"=%f", A)
print(a+b); -->printf("a+b = %f", a+b);
2.
#define zero(a,b,с,d)
#define one(a,b,с,d)
#define two(a,b,с,d)
Результат:
zero(sin, x, +, y)
one(sin, x, +, y)
two(sin, x, +, y)
a(bcd)
a(b с d)
a(b##c##d)
sin(bcd)
sin(x + y)
sin(x+y)

21. Стандартные заголовочные файлы С

* Стандартные заголовочные файлы С
* assert.h
* ctype.h
* errno.h
* float.h
* limits.h
* locale.h
* math.h
* setjump.h
* signal.h
* stdarg.h
* stddef.h
* stdio.h
* stdlib.h
* string.h
* time.h
Диагностика программ
Преобразование и проверка символов
Проверка ошибок
Работа с вещественными данными
Предельные значения целочисленных данных
Поддержка национальной среды
Математические вычисления
Возможности нелокальных переходов
Обработка исключительных ситуаций
Поддержка переменного числа параметров
Дополнительные определения
Средства ввода-вывода
Функции общего назначения (работа с памятью)
Работа со строками символов
Определение дат и времени
English     Русский Правила