Директива #include

Директива #include включає в текст програми вміст вказаного файлу. Ця директива має дві форми:

1#include "ім'я файлу"
2#include <ім'я файлу>

ім’я файла повинне відповідати угодам операційної системи і може полягати або тільки з імені файлу, або з імені файлу з попереднім йому маршрутом. Якщо ім’я файла вказане в лапках, то пошук файлу здійснюється відповідно до заданого маршруту, а при його відсутності в поточному каталозі. Якщо ім’я файла задане в кутових дужках, то пошук файлу виробляється в стандартних директоріях операційної системи, що задаються командою PATH.

Директива #include може бути вкладеною, тобто у файлі, що включається, теж може міститися директива #include, яка заміщається після включення файлу, що містить цю директиву.

Директива #include широко використовується для включення в програму так званих заголовних файлів, що містять прототипи бібліотечних функцій, і тому більшість програм на СІ починається з цієї директиви.

Директива #define

Директива #define служить для заміни констант, що часто використовуються, ключових слів, операторів або виразів деякими ідентифікаторами. Ідентифікатори, замінюючі текстові або числові константи, називають іменованими константами. Ідентифікатори, замінюючі фрагменти програм, називають макроозначеннями, причому макроозначення можуть мати аргументи.

Директива #define має дві синтаксичні форми:

1#define _ідентифікатор_ текст
2
3#define _ідентифікатор_ (список параметрів) текст

Ця директива замінює всі подальші входження ідентифікатора на текст. Такий процес називається макропідстановкою. Текст може бути будь-яким фрагментом програми на СІ, а також може і бути відсутнім. У останньому випадку всі екземпляри ідентифікатора віддаляються з програми.

Приклад:

1#define WIDTH 80
2
3#define LENGTH (WIDTH+10)

Ці директиви змінять в тексті програми кожне слово WIDTH на число 80, а кожне слово LENGTH на вираз (80+10) разом з оточуючими його дужками.

Дужки, що містяться в макроозначенні, дозволяють уникнути непорозумінь, пов’язаних з порядком обчислення операцій. Наприклад, за відсутності дужок вираз t=LENGTH*7 буде перетворений у вираз t=80+10*7, а не у вираз t=(80+10)*7, як це виходить за наявності дужок, і в результаті вийде 780, а не 630.

У другій синтаксичній формі в директиві #define є список формальних параметрів, який може містити один або декілька ідентифікаторів, розділених комами. Формальні параметри в тексті макроозначення відзначають позиції на які повинні бути підставлені фактичні аргументи макровиклику. Кожен формальний параметр може з’явитися в тексті макроозначення кілька разів.

При макровиклику вслід за ідентифікатором записується список фактичних аргументів, кількість яких повинна співпадати з кількістю формальних параметрів.

Приклад:

1#define MAX(x,y) ((x)>(y))?(x):(y)

Ця директива замінить фрагмент

1t=MAX(i,s[i]);

на фрагмент

1t=((i)>(s[i]))?(i):(s[i]);

Як і в попередньому прикладі, круглі дужки, в які укладені формальні параметри макровизначення, дозволяють уникнути помилок пов’язаних з неправильним порядком виконання операцій, якщо фактичні аргументи є виразами.

Наприклад, за наявності дужок фрагмент t=MAX(i&j,s[i]||j); буде замінений на фрагмент

t=((i&j)>(s[i]||j)?(i&j):(s[i]||j);

а за відсутності дужок - на фрагмент

t=(i&j>s[i]||j)?i&j:s[i]||j;

у якому умовний вираз обчислюється в абсолютно іншому порядку.

Директива #undef

Директива #undef використовується для відміни дії директиви #define. Синтаксис цієї директиви наступний #undef ідентифікатор

Директива відміняє дію поточного визначення #define для вказаного ідентифікатора. Не є помилкою використання директиви #undef для ідентифікатора, який не був визначений директивою #define.

Приклад:

1#undef WIDTH
2
3#undef MAX

Ці директиви відміняють визначення іменованої константи WIDTH і макроозначення MAX.