Similar presentations:
Препроцессор Си. Директивы и операторы препроцессора Си
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
Диагностика программ
Преобразование и проверка символов
Проверка ошибок
Работа с вещественными данными
Предельные значения целочисленных данных
Поддержка национальной среды
Математические вычисления
Возможности нелокальных переходов
Обработка исключительных ситуаций
Поддержка переменного числа параметров
Дополнительные определения
Средства ввода-вывода
Функции общего назначения (работа с памятью)
Работа со строками символов
Определение дат и времени