Презентвція. Препроцессор команди мова С

Про матеріал
Препроцессор команди Препроцессор — це спеціальна програма, що входить до складу компілятора C. Він призначений для попередньої обробки тексту програми. Препроцесор дозволяє включати файли в текст програми і вводити визначення макросів.
Перегляд файлу
Препроцесор — це спеціальна програма, що входить до складу компілятора C. Він призначений для попередньої обробки тексту програми. Препроцесор дозволяє включати файли в текст програми і вводити визначення макросів.
Основні директиви препроцесора# include — вставляє текст з вказаного файла#define — визначає визначення макросу (макрос) або символьну константу# undef — скасовує попереднє визначення#if - виконує умовну компіляцію, коли константа виразу істинна#ifdef - виконує умовну компіляцію з визначеною символічною константою#ifndef - виконує умовну компіляцію при невизначеності символічної константа#else - умовна гілка компіляції, якщо вираз є хибним#еліf — умовна гілка компіляції, утворена злиттям else і if#endif - кінець умовної гілки компіляції#line - препроцесор змінює номер поточного рядка і назву скомпільованого файлу# помилка — надання діагностичного повідомлення#pragma — це дія, яка залежить від конкретної реалізації компілятора.
Директива #include	Директива #include дозволяє включити вказаний файл в текст програми. Якщо заголовний файл містить опис функцій бібліотеки і знаходиться в теці компілятора, він вкладений в кутові дужки<>. Якщо файл знаходиться в поточному каталозі проекту, його вказують в лапках «». Для файла у іншому каталозі, вам слід вказати повний шлях у лапках.#include <stdio.h>#include 
Директива #define	Директива #define дозволяє вводити константи і визначення макросів в текст програми. Загальна форма запису # define Ідентифікатор Заміна Поля Ідентифікатор і Замінника розділені одним або більше пробілами. Директива #define вказує компілятору, що потрібно поставити рядок, який визначений аргументом Заміна, замість кожного аргументу Ідентифікатор у вихідному файлі. Ідентифікатор не замінюється, якщо він знаходиться в коментарі, в рядку, або як частина більш довго ідентифікатора.#include <stdio.h>#define A 3int main(){  printf(
	В залежності від значення константи компілятор присвоює їй той чи інший тип. Для перевизначення типу константи можна використовувати суфікси: #define A 280 U   // unsigned int#define B 280 LU  // unsigned long int#define C 280    // int (long int)#define D 280 L   // long int#define K 28.0   // double#define L 28.0 F  // float#define M 28.0 L  // long double. U або u представляє цілу константу в безнаковому вигляді (unsigned);F (або f) дозволяє описати дійсну константу типу float;L (або l) дозволяє виділити цілочисленній константі 8 байт (Long int);L (або l) дозволяє описувати дійсну константу типу long double
 Друга форма синтаксису визначає макрос, схожий на функцію, з параметрами. Ця форма дозволяє використовувати необов'язковий список параметрів, які повинні бути в дужках. Після визначення макроса кожне послідуюче входження замінюється версією аргументу, що заміняє фактичні аргументи замість формальних аргументів. Пример на Си: Вычисление синуса угла#include <stdio.h>#include <stdlib.h>#include <math.h>#define PI 3.14159265#define SIN(x) sin(PI*x/180)int main(){  int c;  printf(
	Різниця між цими визначеннями макросів і функціями в C полягає в тому, що на етапі компіляції кожен випадок ідентифікатора замінюється відповідним кодом. Таким чином, програма може мати кілька копій одного і того ж коду, що відповідає ідентифікатору. У випадку функцій, програма міститиме 1 копію коду, що реалізує задану функцію, і кожного разу, коли ви відкриваєте функцію, їй буде надано контроль.	Вилучити визначення макросів можна за допомогою директиви #undef. Однак при використанні таких макровизначень,потрібно бути обережним. Наприклад#include <stdio.h>#define sum(A,B) A+Bint main(){  int a, b, c, d;  a = 3; b = 5;  c = (a + b) * 2; // c = (a + b)*2  d = sum(a, b) * 2; // d = a + b*2;  printf(
 По замовчуванні , текст макровизначення слід розташувати на одному рядку. Якщо потрібно перенести текст визначення макросу до нового рядка, то в кінці поточного рядка ставиться символ 'зворотний слеш’ - /.#include <stdio.h>#define sum(A,B) A + \                 Bint main(){  int a, b, c, d;  a = 3; b = 5;  c = (a + b) * 2; // c = (a + b)*2  d = sum(a, b) * 2; // d = a + b*2;  printf(#define SUM(x,y) (a##x + a##y)int main(){  int a1 = 5, a2 = 3;  printf("%d", SUM(1, 2)); // (a1 + a2)  getchar();  return 0;}" title=" По замовчуванні , текст макровизначення слід розташувати на одному рядку. Якщо потрібно перенести текст визначення макросу до нового рядка, то в кінці поточного рядка ставиться символ 'зворотний слеш’ - /.#include #define sum(A,B) A + \                 Bint main(){  int a, b, c, d;  a = 3; b = 5;  c = (a + b) * 2; // c = (a + b)*2  d = sum(a, b) * 2; // d = a + b*2;  printf(" a = %d\n b = %d\n", a, b);  printf(" c = %d \n d = %d \n", c, d);  getchar();  return 0;} Крім того, директива #define дозволяє замінити частину ідентифікатора. Щоб вказати частину, яку слід замінити, скористайтеся ##.#include #define SUM(x,y) (a##x + a##y)int main(){  int a1 = 5, a2 = 3;  printf("%d", SUM(1, 2)); // (a1 + a2)  getchar();  return 0;}">
Умовна компіляція Директиви #if або #ifdef/#ifndef разом з директивами #elif, #else і #endif контролюють компіляцію частин вихідного файлу.	Якщо вказаний вираз після #if є ненульовим значенням, то записі перетворенняться зберігає група рядків, які слідують за директивою #if.#if вираз-константа	група операцій#elif вираз-константа група операцій#else група операцій#endif	Різниця директив # ifdef/#ifndef це те, що вираз-константу можна вказувати лише за допомогою #define. Пример#include <stdio.h>#include <stdlib.h>#define P 2int main(){#if P==1  printf(
	Оператор перевизначення типів typoderf вводить синонім існуючого типу, наприкладtypedef unsigned char BYTE;BYTE b;  // b – типа unsigned char Використання typdeferf для перевизначення типів схоже на #define, але#define  є директивою препроцесора і обробляється перед компіляцією шляхом простої заміни всіх входжень:#define P_INT int*typedef int* p_integer;P_INT p1, p2; // int* p1, int p2;p_integer p3, p4; // int* p3, int* p4;З допомогою #define не можна оголосити ім'я функції або масиву, але можна використовувати typdefeftypedef unsigned char name[30];name my;  // my – рядок із 30 символів
 Typadif широко використовується в Windows API для опису типів функцій, що використовуються в програмуванні Windows віконних застосунків.#include <stdio.h>#include <string.h>typedef struct Books{  char  title[50], author[50], subject[100];  int   book_id;} Book;int main() {  Book book;  strcpy_s(book.title, 
 Для представлення константи в C використовувалася тільки директива препроцесора #define: (Константи в C++ схожі на константи в C.)#define MAX 100	У мові C++ рекомендується використовувати змінну з початковим значенням і ключовим словом const:const тип Ім’я. Змінної = Початкове. Значення;const int n=10;	Область видимості константи збігається з областю звичайної змінної. За допомогою const можна оголосити вказівник на константу const тип *Ім’я. Змінної;const int *m; // m – вказівник на константу типа intconst int n=3;m = &n;
	Ще одна можливість const полягає у створенні постійного покажчика на величину вказаного типутип *const Ім’я. Змінної = Значення; int i;int *const ptri=&i;Однак не кожне використання #define може бути замінити const. Наприклад, не можна оголошувати масив з розміром, вказаним який вказаний через const.  const size=3; int a[size];Такий код не спрацює. Використання const має кілька переваг перед #define. При оголошенні константи за допомогою const явно вказується тип величини. Константа, оголошена const, просто узгоджується з іншими типами, таких, як оголошення масиву: const int base_vals[5] = { 1000, 2000, 3500, 6000, 10000};Ідентифікатори const слідують тим самим правилам, що і змінні. Можна створювати константи з різною областю видимості
Перерахований тип даних За допомогою ключового слова enum можна оголосити особливий цілочисельний тип з набором іменних цілих чисел, що називаються перераховані константи:enum тег {СписокІменованих. Констант};  enum day {sun, mon, tue, wen, thu, fri, sat}; enum flag {false, true};	Перерахована константа може бути оголошена анонімно (без мітки): enum {off,on} signal; signal=on;
 Це визначення створює цілочисельний тип day з назвами 7 днів тижня, кожен з яких є цілочисельною константою.	Перелічені константи є ідентифікаторами, які мають такі типові значення: 0, 1, 2, 3, 4, 5, 6. Першому присвоюється значення 0, а кожному наступному — на 1 більше, ніж попередньому. Якщо значення по замовчуванню нас не задовольняють, то перераховані константи можуть бути ініціалізовані довільними цілими числами або константами enum number {a=54,b,c=60,d=c+5}; // b=55, d=65 Перерахована константа може бути оголошена анонімно (без мітки): 	enum {off,on} signal;	signal=on;
Препроцесор Дякуємо за увагу
Зміст слайдів
Номер слайду 1

Препроцесор — це спеціальна програма, що входить до складу компілятора C. Він призначений для попередньої обробки тексту програми. Препроцесор дозволяє включати файли в текст програми і вводити визначення макросів.

Номер слайду 2

Основні директиви препроцесора# include — вставляє текст з вказаного файла#define — визначає визначення макросу (макрос) або символьну константу# undef — скасовує попереднє визначення#if - виконує умовну компіляцію, коли константа виразу істинна#ifdef - виконує умовну компіляцію з визначеною символічною константою#ifndef - виконує умовну компіляцію при невизначеності символічної константа#else - умовна гілка компіляції, якщо вираз є хибним#еліf — умовна гілка компіляції, утворена злиттям else і if#endif - кінець умовної гілки компіляції#line - препроцесор змінює номер поточного рядка і назву скомпільованого файлу# помилка — надання діагностичного повідомлення#pragma — це дія, яка залежить від конкретної реалізації компілятора.

Номер слайду 3

Директива #include Директива #include дозволяє включити вказаний файл в текст програми. Якщо заголовний файл містить опис функцій бібліотеки і знаходиться в теці компілятора, він вкладений в кутові дужки<>. Якщо файл знаходиться в поточному каталозі проекту, його вказують в лапках «». Для файла у іншому каталозі, вам слід вказати повний шлях у лапках.#include #include "func.c"

Номер слайду 4

Директива #define Директива #define дозволяє вводити константи і визначення макросів в текст програми. Загальна форма запису # define Ідентифікатор Заміна Поля Ідентифікатор і Замінника розділені одним або більше пробілами. Директива #define вказує компілятору, що потрібно поставити рядок, який визначений аргументом Заміна, замість кожного аргументу Ідентифікатор у вихідному файлі. Ідентифікатор не замінюється, якщо він знаходиться в коментарі, в рядку, або як частина більш довго ідентифікатора.#include #define A 3int main(){  printf("%d + %d = %d", A, A, A+A); // 3 + 3 = 6  getchar();  return 0;}

Номер слайду 5

В залежності від значення константи компілятор присвоює їй той чи інший тип. Для перевизначення типу константи можна використовувати суфікси: #define A 280 U   // unsigned int#define B 280 LU  // unsigned long int#define C 280    // int (long int)#define D 280 L   // long int#define K 28.0   // double#define L 28.0 F  // float#define M 28.0 L  // long double. U або u представляє цілу константу в безнаковому вигляді (unsigned);F (або f) дозволяє описати дійсну константу типу float;L (або l) дозволяє виділити цілочисленній константі 8 байт (Long int);L (або l) дозволяє описувати дійсну константу типу long double

Номер слайду 6

Друга форма синтаксису визначає макрос, схожий на функцію, з параметрами. Ця форма дозволяє використовувати необов'язковий список параметрів, які повинні бути в дужках. Після визначення макроса кожне послідуюче входження замінюється версією аргументу, що заміняє фактичні аргументи замість формальних аргументів. Пример на Си: Вычисление синуса угла#include #include #include #define PI 3.14159265#define SIN(x) sin(PI*x/180)int main(){  int c;  printf("Ввести кут у градусах: ");  scanf("%d", &c);  printf("sin(%d)=%lf", c, SIN(c));  getchar(); getchar();  return 0;}идентификатор(аргумент1, ..., агрументn)

Номер слайду 7

Різниця між цими визначеннями макросів і функціями в C полягає в тому, що на етапі компіляції кожен випадок ідентифікатора замінюється відповідним кодом. Таким чином, програма може мати кілька копій одного і того ж коду, що відповідає ідентифікатору. У випадку функцій, програма міститиме 1 копію коду, що реалізує задану функцію, і кожного разу, коли ви відкриваєте функцію, їй буде надано контроль. Вилучити визначення макросів можна за допомогою директиви #undef. Однак при використанні таких макровизначень,потрібно бути обережним. Наприклад#include #define sum(A,B) A+Bint main(){  int a, b, c, d;  a = 3; b = 5;  c = (a + b) * 2; // c = (a + b)*2  d = sum(a, b) * 2; // d = a + b*2;  printf(" a = %d\n b = %d\n", a, b);  printf(" c = %d \n d = %d \n", c, d);  getchar();  return 0;}

Номер слайду 8

По замовчуванні , текст макровизначення слід розташувати на одному рядку. Якщо потрібно перенести текст визначення макросу до нового рядка, то в кінці поточного рядка ставиться символ 'зворотний слеш’ - /.#include #define sum(A,B) A + \                 Bint main(){  int a, b, c, d;  a = 3; b = 5;  c = (a + b) * 2; // c = (a + b)*2  d = sum(a, b) * 2; // d = a + b*2;  printf(" a = %d\n b = %d\n", a, b);  printf(" c = %d \n d = %d \n", c, d);  getchar();  return 0;} Крім того, директива #define дозволяє замінити частину ідентифікатора. Щоб вказати частину, яку слід замінити, скористайтеся ##.#include #define SUM(x,y) (a##x + a##y)int main(){  int a1 = 5, a2 = 3;  printf("%d", SUM(1, 2)); // (a1 + a2)  getchar();  return 0;}

Номер слайду 9

Умовна компіляція Директиви #if або #ifdef/#ifndef разом з директивами #elif, #else і #endif контролюють компіляцію частин вихідного файлу. Якщо вказаний вираз після #if є ненульовим значенням, то записі перетворенняться зберігає група рядків, які слідують за директивою #if.#if вираз-константа група операцій#elif вираз-константа група операцій#else група операцій#endif Різниця директив # ifdef/#ifndef це те, що вираз-константу можна вказувати лише за допомогою #define. Пример#include #include #define P 2int main(){#if P==1  printf("Виконується гілка 1");#elif P==2  printf("Виконується гілка 2, P=%d", P);#else  printf("Виконується друга гілка , P=%d", P);#endif  getchar();  return 0;}

Номер слайду 10

Оператор перевизначення типів typoderf вводить синонім існуючого типу, наприкладtypedef unsigned char BYTE;BYTE b;  // b – типа unsigned char Використання typdeferf для перевизначення типів схоже на #define, але#define  є директивою препроцесора і обробляється перед компіляцією шляхом простої заміни всіх входжень:#define P_INT int*typedef int* p_integer;P_INT p1, p2; // int* p1, int p2;p_integer p3, p4; // int* p3, int* p4;З допомогою #define не можна оголосити ім'я функції або масиву, але можна використовувати typdefeftypedef unsigned char name[30];name my;  // my – рядок із 30 символів

Номер слайду 11

Typadif широко використовується в Windows API для опису типів функцій, що використовуються в програмуванні Windows віконних застосунків.#include #include typedef struct Books{  char  title[50], author[50], subject[100];  int   book_id;} Book;int main() {  Book book;  strcpy_s(book.title, "C Programming");  strcpy_s(book.author, "Nuha Ali");  strcpy_s(book.subject, "C Programming Tutorial");  book.book_id = 6495407;  printf("book title : %s\n", book.title);  printf("book author : %s\n", book.author);  printf("book subject : %s\n", book.subject);  printf("book book_id : %d\n", book.book_id);  getchar(); getchar();  return 0;}

Номер слайду 12

Для представлення константи в C використовувалася тільки директива препроцесора #define: (Константи в C++ схожі на константи в C.)#define MAX 100 У мові C++ рекомендується використовувати змінну з початковим значенням і ключовим словом const:const тип Ім’я. Змінної = Початкове. Значення;const int n=10; Область видимості константи збігається з областю звичайної змінної. За допомогою const можна оголосити вказівник на константу const тип *Ім’я. Змінної;const int *m; // m – вказівник на константу типа intconst int n=3;m = &n;

Номер слайду 13

Ще одна можливість const полягає у створенні постійного покажчика на величину вказаного типутип *const Ім’я. Змінної = Значення; int i;int *const ptri=&i;Однак не кожне використання #define може бути замінити const. Наприклад, не можна оголошувати масив з розміром, вказаним який вказаний через const.  const size=3; int a[size];Такий код не спрацює. Використання const має кілька переваг перед #define. При оголошенні константи за допомогою const явно вказується тип величини. Константа, оголошена const, просто узгоджується з іншими типами, таких, як оголошення масиву: const int base_vals[5] = { 1000, 2000, 3500, 6000, 10000};Ідентифікатори const слідують тим самим правилам, що і змінні. Можна створювати константи з різною областю видимості

Номер слайду 14

Перерахований тип даних За допомогою ключового слова enum можна оголосити особливий цілочисельний тип з набором іменних цілих чисел, що називаються перераховані константи:enum тег {СписокІменованих. Констант};  enum day {sun, mon, tue, wen, thu, fri, sat}; enum flag {false, true}; Перерахована константа може бути оголошена анонімно (без мітки): enum {off,on} signal; signal=on;

Номер слайду 15

Це визначення створює цілочисельний тип day з назвами 7 днів тижня, кожен з яких є цілочисельною константою. Перелічені константи є ідентифікаторами, які мають такі типові значення: 0, 1, 2, 3, 4, 5, 6. Першому присвоюється значення 0, а кожному наступному — на 1 більше, ніж попередньому. Якщо значення по замовчуванню нас не задовольняють, то перераховані константи можуть бути ініціалізовані довільними цілими числами або константами enum number {a=54,b,c=60,d=c+5}; // b=55, d=65 Перерахована константа може бути оголошена анонімно (без мітки):  enum {off,on} signal; signal=on;

Номер слайду 16

Препроцесор Дякуємо за увагу

pptx
Додано
16 серпня 2022
Переглядів
983
Оцінка розробки
Відгуки відсутні
Безкоштовний сертифікат
про публікацію авторської розробки
Щоб отримати, додайте розробку

Додати розробку