Скачать презентацию Директивою препроцесора називається рядок у вихідному коді що Скачать презентацию Директивою препроцесора називається рядок у вихідному коді що

Tema_12_Срр.pptx

  • Количество слайдов: 13

Директивою препроцесора називається рядок у вихідному коді, що має наступний формат: # ключве_слово параметри Директивою препроцесора називається рядок у вихідному коді, що має наступний формат: # ключве_слово параметри Список ключових слів: define - створення константи або макросу; undef - видалення константи або макросу; include - вставка вмісту вказаного файлу; if - перевірка істинності вираження; ifdef - перевірка існування константи або макросу; ifndef - перевірка не існування константи або макросу; else - гілка умовної компіляції при хибності вираження if; elif - перевірка істинності іншого виразу; коротка форма запису для комбінації else і if; endif - кінець гілки умовної компіляції; line - вказівка імені файлу і номера поточного рядка для компілятора; error - вивід повідомлення і зупинка компіляції; warning - вивід повідомлення без зупинки компіляції; pragma - вказівка дії, залежного від реалізації, для препроцесора або компілятора; якщо ключове слово не вказано, директива ігнорується; якщо вказано неіснуюче ключове слово, виводиться повідомлення про помилку і компіляція переривається.

Мова С++ Лекція 12 Макроси Мова С++ Лекція 12 Макроси

Макроси Макрос – фрагмент коду, який виглядає як функція, але не є нею. Відмінності Макроси Макрос – фрагмент коду, який виглядає як функція, але не є нею. Відмінності між макросом та функцією: • Макрос замінюється своїм визначенням під час роботи препроцесора і тому не викликає додаткових затрат часу на виклик. • Використання макросу приводить до розростання коду і збільшення програми • Компілятор не виконує ніяких перевірок типів у макросі • Неможливо оголосити вказівник на макрос або використати його адресу, оскільки макрос є засобом для вбудовування фрагмента коду. Імена макросів прийнято записувати великими буквами. 1

 Звичайний макрос #define MAXN 1000 Функціональний макрос #define abs(x) ((x)>=0? (x): -(x)) #define Звичайний макрос #define MAXN 1000 Функціональний макрос #define abs(x) ((x)>=0? (x): -(x)) #define max(a, b) ((a)>(b)? (a): (b)) Макрос з використанням вказівників #define m. Sum(p. Var 1, p. Var 2) ((*(p. Var 1)) + (*(p. Var 2))) 2

Приклади #include <cstdlib> #include <iostream> #define MULT(x, y) ((x)*(y)) using namespace std; int main(int Приклади #include #include #define MULT(x, y) ((x)*(y)) using namespace std; int main(int argc, char *argv[]) { int a=2, b=2; printf ("rez=%dn", MULT(a, b)); system("PAUSE"); return EXIT_SUCCESS; } 3

#include <cstdlib> #include <iostream> #define MULT(x, y) (x*y) using namespace std; int main(int argc, #include #include #define MULT(x, y) (x*y) using namespace std; int main(int argc, char *argv[]) { int a=2, b=3; printf ("rez 1=%dn", MULT(a, b)); printf ("rez 2=%dn", MULT(a+1, b)); system("PAUSE"); return EXIT_SUCCESS; } #include #include #define MULT(x, y) ((x)*(y)) using namespace std; int main(int argc, char *argv[]) { int a=2, b=3; printf ("rez 1=%dn", MULT(a, b)); printf ("rez 2=%dn", MULT(a+1, b)); system("PAUSE"); return EXIT_SUCCESS; } 4

#include <stdio. h> #define m. Sum(p. Var 1, p. Var 2) ((*(p. Var 1)) #include #define m. Sum(p. Var 1, p. Var 2) ((*(p. Var 1)) + (*(p. Var 2))) void main(void) { int n. Var 1 = 5; int n. Var 2 = 8; int *p. Var 1 = &n. Var 1; int *p. Var 2 = &n. Var 2; printf("n%d + %d = %dnn", n. Var 1, n. Var 2, Sum(p. Var 1, p. Var 2)); } 5

 • Правильно оформлений макрос: #define MACRO(x) printf(“%d”, x) • Неправильно оформлений макрос (лишній • Правильно оформлений макрос: #define MACRO(x) printf(“%d”, x) • Неправильно оформлений макрос (лишній пробіл): #define MACRO (x) printf(“%d”, x) буде розкритий як: (x) printf(“%d”, x); • Якщо макрос розміщується в кількох рядках: #define WARN_IF(EXP) do { if (EXP) fprintf (stderr, "Warning: " #EXP "n"); } while (0) 6

Локальні змінні в макросах У макросах можна використовувати локальні змінні. Якщо ім'я такої локальної Локальні змінні в макросах У макросах можна використовувати локальні змінні. Якщо ім'я такої локальної змінної співпаде з ім'ям глобальної, то глобальна змінна буде закрита локальною всередині макросу. Але присвоєння значень локальній змінній не вплине на глобальну. Приклад макросу: #include #include #define m. Sum(p. Var) int mr_n. Var = ((*(p. Var)) + 1); ((*(p. Var)) = (*(p. Var)) + mr_n. Var) using namespace std; int main() { int n. Var = 5; int *p. Var = &n. Var; m. Sum(p. Var); printf("nsum = %dnn", *p. Var); system("PAUSE"); return EXIT_SUCCESS; } 7

Блоки в макросах У макросах можна застосовувати фігурні дужки, таким чином отримувати блок. #include Блоки в макросах У макросах можна застосовувати фігурні дужки, таким чином отримувати блок. #include #include using namespace std; #define m. Sum(p. Var) {(*(p. Var)) += 10; } int main() { int n. Var = 5; int *p. Var = &n. Var; if(n. Var > 0) m. Sum(p. Var); printf("nsum = %dnn", *p. Var); system("PAUSE"); return EXIT_SUCCESS; } 8

Макроси зі змінним числом параметрів Макроси в C можуть мати змінне число параметрів. Такі Макроси зі змінним числом параметрів Макроси в C можуть мати змінне число параметрів. Такі макроси називають variadic macros. #include #define m. My. Print(. . . ) printf(__VA_ARGS__) int main() { char *sz. First = "This is "; char *sz. Second = "a variadic macro"; m. My. Print("n%s%snn", sz. First, sz. Second); system("PAUSE"); return EXIT_SUCCESS; } Правила тут такі: змінні параметри позначаємо трьома крапками; якщо є і іменовані параметри, то змінні параметри повинні бути останніми в списку параметрів в тілі макросу змінні параметри замінюють ідентифікатором __VA_ARGS__ 9

Запуск з макросу іншого макросу #include <stdio. h> #define m. First. Macro(n. Var) ((n. Запуск з макросу іншого макросу #include #define m. First. Macro(n. Var) ((n. Var) + m. Second. Macro(n. Var)) #define m. Second. Macro(n. Var) ((n. Var) * 2) int main() { int n. Var = 5; printf("nn. Var = %dnn", m. First. Macro(n. Var)); system("PAUSE"); return EXIT_SUCCESS; } 10

Як за допомогою макросу перетворити об'єкт в рядок? #include <stdio. h> #define m. Int. Як за допомогою макросу перетворити об'єкт в рядок? #include #define m. Int. To. Str(n. Var) (#n. Var) int main() { printf("n 3 = %snn", m. Int. To. Str(1 + 2)); system("PAUSE"); return EXIT_SUCCESS; } #include #define m. Int. To. Str(n. Var) int main() { printf("n 3 = %snn", m. Int. To. Str(1 + 2)); system("PAUSE"); return EXIT_SUCCESS; } 11