Основні директиви препроцесора# include — вставляє текст з вказаного файла#define — визначає визначення макросу (макрос) або символьну константу# undef — скасовує попереднє визначення#if - виконує умовну компіляцію, коли константа виразу істинна#ifdef - виконує умовну компіляцію з визначеною символічною константою#ifndef - виконує умовну компіляцію при невизначеності символічної константа#else - умовна гілка компіляції, якщо вираз є хибним#еліf — умовна гілка компіляції, утворена злиттям else і if#endif - кінець умовної гілки компіляції#line - препроцесор змінює номер поточного рядка і назву скомпільованого файлу# помилка — надання діагностичного повідомлення#pragma — це дія, яка залежить від конкретної реалізації компілятора.
Директива #include Директива #include дозволяє включити вказаний файл в текст програми. Якщо заголовний файл містить опис функцій бібліотеки і знаходиться в теці компілятора, він вкладений в кутові дужки<>. Якщо файл знаходиться в поточному каталозі проекту, його вказують в лапках «». Для файла у іншому каталозі, вам слід вказати повний шлях у лапках.#include
Директива #define Директива #define дозволяє вводити константи і визначення макросів в текст програми. Загальна форма запису # define Ідентифікатор Заміна Поля Ідентифікатор і Замінника розділені одним або більше пробілами. Директива #define вказує компілятору, що потрібно поставити рядок, який визначений аргументом Заміна, замість кожного аргументу Ідентифікатор у вихідному файлі. Ідентифікатор не замінюється, якщо він знаходиться в коментарі, в рядку, або як частина більш довго ідентифікатора.#include
В залежності від значення константи компілятор присвоює їй той чи інший тип. Для перевизначення типу константи можна використовувати суфікси: #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
Різниця між цими визначеннями макросів і функціями в C полягає в тому, що на етапі компіляції кожен випадок ідентифікатора замінюється відповідним кодом. Таким чином, програма може мати кілька копій одного і того ж коду, що відповідає ідентифікатору. У випадку функцій, програма міститиме 1 копію коду, що реалізує задану функцію, і кожного разу, коли ви відкриваєте функцію, їй буде надано контроль. Вилучити визначення макросів можна за допомогою директиви #undef. Однак при використанні таких макровизначень,потрібно бути обережним. Наприклад#include
По замовчуванні , текст макровизначення слід розташувати на одному рядку. Якщо потрібно перенести текст визначення макросу до нового рядка, то в кінці поточного рядка ставиться символ 'зворотний слеш’ - /.#include
Умовна компіляція Директиви #if або #ifdef/#ifndef разом з директивами #elif, #else і #endif контролюють компіляцію частин вихідного файлу. Якщо вказаний вираз після #if є ненульовим значенням, то записі перетворенняться зберігає група рядків, які слідують за директивою #if.#if вираз-константа група операцій#elif вираз-константа група операцій#else група операцій#endif Різниця директив # ifdef/#ifndef це те, що вираз-константу можна вказувати лише за допомогою #define. Пример#include
Оператор перевизначення типів 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
Для представлення константи в 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;