SlideShare a Scribd company logo
ANSI C
Language
Introduction
Lection 8
Содержание
• Основные директивы
• Директивы: примеры
• Макрокоманда
• MIN, MAX macros
• SUM, MULT macros
• Bit Modifications macros
23.05.2019 0:20 Introduction 2
Основные директивы
3
Директива Описание
#include вставляет текст из указанного файла
#define задаёт макроопределение (макрос) или символическую константу
#undef отменяет предыдущее определение
#line препроцессор изменяет номер текущей строки и имя
компилируемого файла
#error выдача диагностического сообщения и остановка компиляции
#pragma действие, зависящее от конкретной реализации компилятора
Основные директивы
4
Директива Описание
#if осуществляет условную компиляцию при
истинности константного выражения
#ifdef осуществляет условную компиляцию при
определённости символической константы
#ifndef осуществляет условную компиляцию при
неопределённости символической константы
#else ветка условной компиляции при ложности выражения
#elif ветка условной компиляции, образуемая слиянием else и if
#endif конец ветки условной компиляции
Директивы: пример #1
5
#include "main.h“
#define BUFFER_SIZE_MAX 1024
#line 500
int main(void)
{
unsigned int i;
while (1)
{
// Insert some code here...
}
return 0;
}
Директивы: пример #2
6
#define LEDS_ON
#ifdef LEDS_ON
HAL_GPIO_WritePin(
GPIOD,
GPIO_PIN_15|GPIO_PIN_14,
GPIO_PIN_SET);
#else
HAL_GPIO_WritePin(
GPIOD,
GPIO_PIN_15|GPIO_PIN_14,
GPIO_PIN_RESET);
#endif
Макрокоманда
Макрокоманда или макрос — это символьное
имя в шаблонах, заменяемое при обработке
препроцессором на последовательность
символов.
Часто макросы применяют для выполнения
рутинных действий
7
MIN, MAX macros
8
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
unsigned char a,b;
a = MIN(5, 10);
b = MAX(a, 20);
SUM macro
9
#define SUM(a, b) a + b
unsigned char a,b;
a = SUM(2, 2);
b = 3 * SUM(2, 2);
SUM modified macro
10
#define SUM(a, b) (a + b)
unsigned char a,b;
a = SUM(2, 2);
b = 3 * SUM(2, 2);
MULT macro
11
#define MULT(a, b) (a * b)
unsigned char a,b;
a = MULT(2, 2);
b = MULT(2, 2 + 3);
MULT macro modified
12
#define MULT(a, b) ((a) * (b))
unsigned char a,b;
a = MULT(2, 2);
b = MULT(2, 2 + 3);
SQR macro
13
#define SQR(x) ((x) * (x))
unsigned char a,b;
b = 4;
a = SQR(b++);
Bit Modifications macros
14
#define SET_BIT(p,n) ((p) |= (1 << (n)))
#define CLEAR_BIT(p,n) ((p) &= ~(1 << (n)))
#define TOGGLE_BIT(p,n) ((p) ^= (1 << (n)))
SET_BIT macro
15
#define SET_BIT(p,n) ((p) |= (1 << (n)))
a = 0x03;
SET_BIT(a, 7);
Разворачиваем пошагово…
a |= (1 << 7)
a |= (0b10000000)
a = 0b00000011 |
0b10000000
------------
a = 0b10000011
В итоге выходит
a = 0x83
CLEAR_BIT macro
16
#define CLEAR_BIT(p,n) ((p) &= ~(1 << (n)))
a = 0xFF;
CLEAR_BIT(a, 3);
Разворачиваем пошагово…
a &= ~(1 << 3)
a &= ~(0b00001000)
a &= (0b11110111)
a = 0b11111111 &
0b11110111
------------
a = 0b11110111
В итоге выходит
a = 0xF7
TOGGLE_BIT macro
17
#define TOGGLE_BIT(p,n) ((p) ^= (1 << (n)))
a = 0x55;
TOGGLE_BIT(a, 6);
Разворачиваем пошагово…
a ^= (1 << 6)
a ^= 0b01000000
a = 0b01010101 ^
0b01000000
------------
a = 0b00010101
В итоге выходит
a = 0x15
REVERSE_BITS macro
18
#define REVERSE_BITS(a) 
( (((a) & 0x80) >> 7) | 
(((a) & 0x40) >> 5) | 
(((a) & 0x20) >> 3) | 
(((a) & 0x10) >> 1) | 
(((a) & 0x08) << 1) | 
(((a) & 0x04) << 3) | 
(((a) & 0x02) << 5) | 
(((a) & 0x01) << 7) )
0x 8 F -> 0x F 1
0b10001111 -> 0b11110001

More Related Content

What's hot

6.4 Ещё о шаблонах
6.4 Ещё о шаблонах6.4 Ещё о шаблонах
6.4 Ещё о шаблонах
DEVTYPE
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Platonov Sergey
 
Функции, 11-й клаас
Функции, 11-й клаасФункции, 11-й клаас
Функции, 11-й клаасAlbina
 
Глобальная дискретная оптимизация при помощи разрезов графов
Глобальная дискретная оптимизация при помощи разрезов графовГлобальная дискретная оптимизация при помощи разрезов графов
Глобальная дискретная оптимизация при помощи разрезов графовromovpa
 
Step cpp022
Step cpp022Step cpp022
Step cpp022
Evgenij Laktionov
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 Перегрузка
DEVTYPE
 
Step cpp0201
Step cpp0201Step cpp0201
Step cpp0201
Evgenij Laktionov
 
Pervoobraznaya i neopredelennyj_integral
Pervoobraznaya i neopredelennyj_integralPervoobraznaya i neopredelennyj_integral
Pervoobraznaya i neopredelennyj_integral
dimonz9
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Mikhail Kurnosov
 
A Method of Reducing Computational Complexity in Verification of Programming ...
A Method of Reducing Computational Complexity in Verification of Programming ...A Method of Reducing Computational Complexity in Verification of Programming ...
A Method of Reducing Computational Complexity in Verification of Programming ...
Iosif Itkin
 
6.3 Специализация шаблонов
6.3 Специализация шаблонов6.3 Специализация шаблонов
6.3 Специализация шаблонов
DEVTYPE
 
минимизация булевых функций
минимизация булевых функцийминимизация булевых функций
минимизация булевых функций
kuzinolga
 
3.5 Модификаторы доступа
3.5 Модификаторы доступа3.5 Модификаторы доступа
3.5 Модификаторы доступа
DEVTYPE
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Mikhail Kurnosov
 
3.8 Класс массива
3.8 Класс массива3.8 Класс массива
3.8 Класс массива
DEVTYPE
 
Probabilistic Verification in Computational Systems Design
Probabilistic Verification in Computational Systems DesignProbabilistic Verification in Computational Systems Design
Probabilistic Verification in Computational Systems Design
Iosif Itkin
 
Функциональное программирование и Clojure
Функциональное программирование и ClojureФункциональное программирование и Clojure
Функциональное программирование и Clojure
AnjLab
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
Mikhail Kurnosov
 

What's hot (20)

6.4 Ещё о шаблонах
6.4 Ещё о шаблонах6.4 Ещё о шаблонах
6.4 Ещё о шаблонах
 
Lecture 3
Lecture 3Lecture 3
Lecture 3
 
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведенияДракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
Дракон в мешке: от LLVM к C++ и проблемам неопределенного поведения
 
Функции, 11-й клаас
Функции, 11-й клаасФункции, 11-й клаас
Функции, 11-й клаас
 
Глобальная дискретная оптимизация при помощи разрезов графов
Глобальная дискретная оптимизация при помощи разрезов графовГлобальная дискретная оптимизация при помощи разрезов графов
Глобальная дискретная оптимизация при помощи разрезов графов
 
Step cpp022
Step cpp022Step cpp022
Step cpp022
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 Перегрузка
 
Step cpp0201
Step cpp0201Step cpp0201
Step cpp0201
 
Pervoobraznaya i neopredelennyj_integral
Pervoobraznaya i neopredelennyj_integralPervoobraznaya i neopredelennyj_integral
Pervoobraznaya i neopredelennyj_integral
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
A Method of Reducing Computational Complexity in Verification of Programming ...
A Method of Reducing Computational Complexity in Verification of Programming ...A Method of Reducing Computational Complexity in Verification of Programming ...
A Method of Reducing Computational Complexity in Verification of Programming ...
 
6.3 Специализация шаблонов
6.3 Специализация шаблонов6.3 Специализация шаблонов
6.3 Специализация шаблонов
 
минимизация булевых функций
минимизация булевых функцийминимизация булевых функций
минимизация булевых функций
 
3.5 Модификаторы доступа
3.5 Модификаторы доступа3.5 Модификаторы доступа
3.5 Модификаторы доступа
 
стандартные функции
стандартные функциистандартные функции
стандартные функции
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
 
3.8 Класс массива
3.8 Класс массива3.8 Класс массива
3.8 Класс массива
 
Probabilistic Verification in Computational Systems Design
Probabilistic Verification in Computational Systems DesignProbabilistic Verification in Computational Systems Design
Probabilistic Verification in Computational Systems Design
 
Функциональное программирование и Clojure
Функциональное программирование и ClojureФункциональное программирование и Clojure
Функциональное программирование и Clojure
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 

Similar to C language lect_08_introduction

лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)djbelyakk
 
СИМПЛЕКС-МЕТОД
СИМПЛЕКС-МЕТОДСИМПЛЕКС-МЕТОД
СИМПЛЕКС-МЕТОДIT_1315
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
Platonov Sergey
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Yandex
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
Tech Talks @NSU
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
Igor Shkulipa
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Mikhail Kurnosov
 
язык програмирования
язык програмированияязык програмирования
язык програмирования
Olegmingalev1997
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибками
Tatyanazaxarova
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
Pavel Tsukanov
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Mail.ru Group
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
Andrey Karpov
 
C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2Technopark
 

Similar to C language lect_08_introduction (20)

лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)
 
СИМПЛЕКС-МЕТОД
СИМПЛЕКС-МЕТОДСИМПЛЕКС-МЕТОД
СИМПЛЕКС-МЕТОД
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Tech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVMTech Talks @NSU: Как приручить дракона: введение в LLVM
Tech Talks @NSU: Как приручить дракона: введение в LLVM
 
Как приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVMКак приручить дракона: введение в LLVM
Как приручить дракона: введение в LLVM
 
Programming c++ (begin-if-else)
Programming c++ (begin-if-else)Programming c++ (begin-if-else)
Programming c++ (begin-if-else)
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.C++ Базовый. Занятие 04.
C++ Базовый. Занятие 04.
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
 
язык програмирования
язык програмированияязык програмирования
язык програмирования
 
Intel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибкамиIntel IPP Samples for Windows - работа над ошибками
Intel IPP Samples for Windows - работа над ошибками
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Принципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-StudioПринципы работы статического анализатора кода PVS-Studio
Принципы работы статического анализатора кода PVS-Studio
 
C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2
 

More from Roman Brovko

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
Roman Brovko
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
Roman Brovko
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
Roman Brovko
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
Roman Brovko
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
Roman Brovko
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
Roman Brovko
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
Roman Brovko
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
Roman Brovko
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
Roman Brovko
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensor
Roman Brovko
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
Roman Brovko
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttons
Roman Brovko
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
Roman Brovko
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
Roman Brovko
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
Roman Brovko
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
Roman Brovko
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
Roman Brovko
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
Roman Brovko
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
Roman Brovko
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
Roman Brovko
 

More from Roman Brovko (20)

Individual task Networking
Individual task NetworkingIndividual task Networking
Individual task Networking
 
Networking essentials lect3
Networking essentials lect3Networking essentials lect3
Networking essentials lect3
 
Gl embedded starterkit_ethernet
Gl embedded starterkit_ethernetGl embedded starterkit_ethernet
Gl embedded starterkit_ethernet
 
Networking essentials lect2
Networking essentials lect2Networking essentials lect2
Networking essentials lect2
 
Networking essentials lect1
Networking essentials lect1Networking essentials lect1
Networking essentials lect1
 
Bare metal training_07_spi_flash
Bare metal training_07_spi_flashBare metal training_07_spi_flash
Bare metal training_07_spi_flash
 
Bare metal training_06_I2C
Bare metal training_06_I2CBare metal training_06_I2C
Bare metal training_06_I2C
 
Glesk worshop
Glesk worshopGlesk worshop
Glesk worshop
 
Bare metal training_05_uart
Bare metal training_05_uartBare metal training_05_uart
Bare metal training_05_uart
 
Bare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensorBare metal training_04_adc_temp_sensor
Bare metal training_04_adc_temp_sensor
 
Bare metal training_03_timers_pwm
Bare metal training_03_timers_pwmBare metal training_03_timers_pwm
Bare metal training_03_timers_pwm
 
Bare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttonsBare metal training_02_le_ds_and_buttons
Bare metal training_02_le_ds_and_buttons
 
Bare metal training_01_hello_world
Bare metal training_01_hello_worldBare metal training_01_hello_world
Bare metal training_01_hello_world
 
Bare metal training_00_prerequisites
Bare metal training_00_prerequisitesBare metal training_00_prerequisites
Bare metal training_00_prerequisites
 
C language lect_23_advanced
C language lect_23_advancedC language lect_23_advanced
C language lect_23_advanced
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
 
C language lect_21_advanced
C language lect_21_advancedC language lect_21_advanced
C language lect_21_advanced
 
подготовка рабочего окружения
подготовка рабочего окруженияподготовка рабочего окружения
подготовка рабочего окружения
 
C language lect_20_advanced
C language lect_20_advancedC language lect_20_advanced
C language lect_20_advanced
 
C language lect_19_basics
C language lect_19_basicsC language lect_19_basics
C language lect_19_basics
 

C language lect_08_introduction

  • 2. Содержание • Основные директивы • Директивы: примеры • Макрокоманда • MIN, MAX macros • SUM, MULT macros • Bit Modifications macros 23.05.2019 0:20 Introduction 2
  • 3. Основные директивы 3 Директива Описание #include вставляет текст из указанного файла #define задаёт макроопределение (макрос) или символическую константу #undef отменяет предыдущее определение #line препроцессор изменяет номер текущей строки и имя компилируемого файла #error выдача диагностического сообщения и остановка компиляции #pragma действие, зависящее от конкретной реализации компилятора
  • 4. Основные директивы 4 Директива Описание #if осуществляет условную компиляцию при истинности константного выражения #ifdef осуществляет условную компиляцию при определённости символической константы #ifndef осуществляет условную компиляцию при неопределённости символической константы #else ветка условной компиляции при ложности выражения #elif ветка условной компиляции, образуемая слиянием else и if #endif конец ветки условной компиляции
  • 5. Директивы: пример #1 5 #include "main.h“ #define BUFFER_SIZE_MAX 1024 #line 500 int main(void) { unsigned int i; while (1) { // Insert some code here... } return 0; }
  • 6. Директивы: пример #2 6 #define LEDS_ON #ifdef LEDS_ON HAL_GPIO_WritePin( GPIOD, GPIO_PIN_15|GPIO_PIN_14, GPIO_PIN_SET); #else HAL_GPIO_WritePin( GPIOD, GPIO_PIN_15|GPIO_PIN_14, GPIO_PIN_RESET); #endif
  • 7. Макрокоманда Макрокоманда или макрос — это символьное имя в шаблонах, заменяемое при обработке препроцессором на последовательность символов. Часто макросы применяют для выполнения рутинных действий 7
  • 8. MIN, MAX macros 8 #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #define MAX(a,b) (((a) > (b)) ? (a) : (b)) unsigned char a,b; a = MIN(5, 10); b = MAX(a, 20);
  • 9. SUM macro 9 #define SUM(a, b) a + b unsigned char a,b; a = SUM(2, 2); b = 3 * SUM(2, 2);
  • 10. SUM modified macro 10 #define SUM(a, b) (a + b) unsigned char a,b; a = SUM(2, 2); b = 3 * SUM(2, 2);
  • 11. MULT macro 11 #define MULT(a, b) (a * b) unsigned char a,b; a = MULT(2, 2); b = MULT(2, 2 + 3);
  • 12. MULT macro modified 12 #define MULT(a, b) ((a) * (b)) unsigned char a,b; a = MULT(2, 2); b = MULT(2, 2 + 3);
  • 13. SQR macro 13 #define SQR(x) ((x) * (x)) unsigned char a,b; b = 4; a = SQR(b++);
  • 14. Bit Modifications macros 14 #define SET_BIT(p,n) ((p) |= (1 << (n))) #define CLEAR_BIT(p,n) ((p) &= ~(1 << (n))) #define TOGGLE_BIT(p,n) ((p) ^= (1 << (n)))
  • 15. SET_BIT macro 15 #define SET_BIT(p,n) ((p) |= (1 << (n))) a = 0x03; SET_BIT(a, 7); Разворачиваем пошагово… a |= (1 << 7) a |= (0b10000000) a = 0b00000011 | 0b10000000 ------------ a = 0b10000011 В итоге выходит a = 0x83
  • 16. CLEAR_BIT macro 16 #define CLEAR_BIT(p,n) ((p) &= ~(1 << (n))) a = 0xFF; CLEAR_BIT(a, 3); Разворачиваем пошагово… a &= ~(1 << 3) a &= ~(0b00001000) a &= (0b11110111) a = 0b11111111 & 0b11110111 ------------ a = 0b11110111 В итоге выходит a = 0xF7
  • 17. TOGGLE_BIT macro 17 #define TOGGLE_BIT(p,n) ((p) ^= (1 << (n))) a = 0x55; TOGGLE_BIT(a, 6); Разворачиваем пошагово… a ^= (1 << 6) a ^= 0b01000000 a = 0b01010101 ^ 0b01000000 ------------ a = 0b00010101 В итоге выходит a = 0x15
  • 18. REVERSE_BITS macro 18 #define REVERSE_BITS(a) ( (((a) & 0x80) >> 7) | (((a) & 0x40) >> 5) | (((a) & 0x20) >> 3) | (((a) & 0x10) >> 1) | (((a) & 0x08) << 1) | (((a) & 0x04) << 3) | (((a) & 0x02) << 5) | (((a) & 0x01) << 7) ) 0x 8 F -> 0x F 1 0b10001111 -> 0b11110001