Препроцесор С/С++ — програмний інструмент, який використовується в мовах програмування C та , препроцесор, що змінює код програми для подальшої компіляції й збірки.
Мова препроцесора C/C++ не є повною за Тюрінгом хоча б тому, що за допомогою директив неможливо змусити препроцесор «зависнути».
Директиви
Директивою препроцесора називається рядок у коді, який має такий вигляд #ключове_слово параметри
. Є чітко визначений список ключових слів:
define
— Задає макровизначення (макроси) або константуundef
— Скасовує попереднє визначенняinclude
— Вставляє текст з зазначеного файлу (імпортує)if
— Здійснює умовну компіляцію при істинності константного виразуifdef
— Здійснює умовну компіляцію, якщо константа визначенаifndef
— Здійснює умовну компіляцію при невизначеності константиelse
— Гілка умовної компіляції при хибності висловлюванняelif
— Гілка умовної компіляції, утворена злиттям else та ifendif
— Кінець гілки умовної компіляціїline
— Препроцесор змінює номер поточного рядка й ім'я файлу для компіляціїerror
— Висвітлення повідомлення з зупинки компіляціїpragma
— Дію, що залежить від конкретної реалізації компілятораwarning
— Висвітлення повідомлення без зупинки компіляції- порожнє слово — пуста дія
Опис директив
Константи та макроси #define
Константи та макроси препроцесора використовуються для визначення невеликих фрагментів коду. Зазвичай константи визначаються за допомогою великих літер.
// константа #define BUFFER_SIZE 1024 #define PI 3.14 // макрос #define NUMBER_OF_ARRAY_ITEMS(array) (sizeof(array)/sizeof(*(array)))
Кожна константа і кожен макрос замінюються відповідним їм визначенням. Макроси мають параметри, схожі на функції, використовуються для зменшення коду.
Приклад визначення макроса max
, який приймає два аргументи: a
і b
та повертає більше з двох число:
#define max( a, b ) ( (a) > (b) ? (a) : (b) )
Макрос викликається як звичайна функція:
z = max(x, y);
Після заміни макроса код виглядатиме так:
z = ((x) > (y) ? (x) : (y));
Директива #include
При виявленні директив #include "..."
або #include <...>
, де «…» — ім'я файлу, препроцесор читає вміст зазначеного файлу, виконує директиви й заміни (підставлення).
Для #include "..."
пошук файлу виконується в цій теці й теках, зазначених в командному рядку компілятора. Для #include <...>
пошук файлу виконується в теках, що містять файли стандартної бібліотеки (шлях до цих тек залежать від компілятора).
Файли, що включаються зазвичай містять:
- оголошення функцій;
- оголошення глобальних змінних;
- визначення інтерфейсів;
- визначення типів даних;
- структури
- та інше.
Директива #include
зазвичай вказується на початку файлу (в заголовку), тому включаються файли називаються заголовками.
Приклад включення файлів зі стандартної бібліотеки мови C:
#include <math.h> // імпортування математичних функцій(стандартна бібліотека) #include <foo.h> // імпортування файлу не зі стандартної бібліотеки
Використання препроцесора вважається неефективним з наступних причин:
- кожен раз при включенні файлів виконуються директиви й заміни (підставляння); компілятор міг би зберігати результати препроцесорування для використання в майбутньому;
- множинні включення одного файлу доводиться запобігати вручну за допомогою директив умовної компіляції; компілятор міг би виконувати цю задачу самостійно.
Починаючи з 1970-х років стали з'являтися способи, якими замінено включення файлів. У мовах Java і Common Lisp використовуються пакети (ключове слово package
) (див. ), в мові Паскаль — англ. units (ключові слова unit
і uses
), у мовах Modula, OCaml, D, Haskell і Python — модулі. Використовуються ключові слова module
і import
.
Посилання
- The C Preprocessor (англ.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Preprocesor S S programnij instrument yakij vikoristovuyetsya v movah programuvannya C ta C preprocesor sho zminyuye kod programi dlya podalshoyi kompilyaciyi j zbirki Mova preprocesora C C ne ye povnoyu za Tyuringom hocha b tomu sho za dopomogoyu direktiv nemozhlivo zmusiti preprocesor zavisnuti DirektiviDiv takozh Direktiva programuvannya Direktivoyu preprocesora nazivayetsya ryadok u kodi yakij maye takij viglyad klyuchove slovo parametri Ye chitko viznachenij spisok klyuchovih sliv define Zadaye makroviznachennya makrosi abo konstantu undef Skasovuye poperednye viznachennya include Vstavlyaye tekst z zaznachenogo fajlu importuye if Zdijsnyuye umovnu kompilyaciyu pri istinnosti konstantnogo virazu ifdef Zdijsnyuye umovnu kompilyaciyu yaksho konstanta viznachena ifndef Zdijsnyuye umovnu kompilyaciyu pri neviznachenosti konstanti else Gilka umovnoyi kompilyaciyi pri hibnosti vislovlyuvannya elif Gilka umovnoyi kompilyaciyi utvorena zlittyam else ta if endif Kinec gilki umovnoyi kompilyaciyi line Preprocesor zminyuye nomer potochnogo ryadka j im ya fajlu dlya kompilyaciyi error Visvitlennya povidomlennya z zupinki kompilyaciyi pragma Diyu sho zalezhit vid konkretnoyi realizaciyi kompilyatora warning Visvitlennya povidomlennya bez zupinki kompilyaciyi porozhnye slovo pusta diyaOpis direktivKonstanti ta makrosi define Konstanti ta makrosi preprocesora vikoristovuyutsya dlya viznachennya nevelikih fragmentiv kodu Zazvichaj konstanti viznachayutsya za dopomogoyu velikih liter konstanta define BUFFER SIZE 1024 define PI 3 14 makros define NUMBER OF ARRAY ITEMS array sizeof array sizeof array Kozhna konstanta i kozhen makros zaminyuyutsya vidpovidnim yim viznachennyam Makrosi mayut parametri shozhi na funkciyi vikoristovuyutsya dlya zmenshennya kodu Priklad viznachennya makrosa max yakij prijmaye dva argumenti a i b ta povertaye bilshe z dvoh chislo define max a b a gt b a b Makros viklikayetsya yak zvichajna funkciya z max x y Pislya zamini makrosa kod viglyadatime tak z x gt y x y Direktiva include Pri viyavlenni direktiv include abo include lt gt de im ya fajlu preprocesor chitaye vmist zaznachenogo fajlu vikonuye direktivi j zamini pidstavlennya Dlya include poshuk fajlu vikonuyetsya v cij teci j tekah zaznachenih v komandnomu ryadku kompilyatora Dlya include lt gt poshuk fajlu vikonuyetsya v tekah sho mistyat fajli standartnoyi biblioteki shlyah do cih tek zalezhat vid kompilyatora Fajli sho vklyuchayutsya zazvichaj mistyat ogoloshennya funkcij ogoloshennya globalnih zminnih viznachennya interfejsiv viznachennya tipiv danih strukturi ta inshe Direktiva includezazvichaj vkazuyetsya na pochatku fajlu v zagolovku tomu vklyuchayutsya fajli nazivayutsya zagolovkami Priklad vklyuchennya fajliv zi standartnoyi biblioteki movi C include lt math h gt importuvannya matematichnih funkcij standartna biblioteka include lt foo h gt importuvannya fajlu ne zi standartnoyi biblioteki Vikoristannya preprocesora vvazhayetsya neefektivnim z nastupnih prichin kozhen raz pri vklyuchenni fajliv vikonuyutsya direktivi j zamini pidstavlyannya kompilyator mig bi zberigati rezultati preprocesoruvannya dlya vikoristannya v majbutnomu mnozhinni vklyuchennya odnogo fajlu dovoditsya zapobigati vruchnu za dopomogoyu direktiv umovnoyi kompilyaciyi kompilyator mig bi vikonuvati cyu zadachu samostijno Pochinayuchi z 1970 h rokiv stali z yavlyatisya sposobi yakimi zamineno vklyuchennya fajliv U movah Java i Common Lisp vikoristovuyutsya paketi klyuchove slovo package div v movi Paskal angl units klyuchovi slova uniti uses u movah Modula OCaml D Haskell i Python moduli Vikoristovuyutsya klyuchovi slova modulei import PosilannyaThe C Preprocessor angl