|
Мета роботи: отимати вміння та практичні навички використання основних директив препроцесора в програмах мовою С.
Теоретична частина
Препроцесор мови С
Препроцесор мови С - це програма, що виконує обробку вхідних даних для іншої програми. Препроцесор мови С переглядає програму до компілятора, заміняє абревіатури в тексті програми на відповідні директиви, відшукує і підключає необхідні файли, може впливати на умови компіляції. Директиви препроцесора мови С в дійсності не є частиною мови С. Препроцесор містить у собі наступні директиви:
# define # undef # include # if # ifdef # ifndef # else # elif # endif # line # error # pragma # | Визначення макросу Скасування визначення макросу Включення об'єкта-заголовка Компіляція, якщо вираз істинний Компіляція, якщо макрос хибний Компіляція, якщо макрос не визначений Компіляція, якщо вираз в if не дійсний Складена директива else/if Закінчення групи компіляції за умовою Заміна новим значенням номера рядка або імені вихідного файлу Форматування помилок трансляції Дія визначається реалізацією Null - директива |
Операції | Призначення |
# ## defined | Додання операнду форми рядка символів Склеювання лексем Представлення # ifdef у форма виразу |
Всі директиви препроцесора починаються із символу #.
Д иректива #Define
Директива #define вводить макровизначення або макрос. Загальна форма директиви наступна:
#define ім'я_макросу послідовність_символів.
Послідовність_символів називають ще рядком заміщення. Коли препроцесор знаходить у вихідному тексті програми ім'я_макросу (надалі будемо говорити просто макрос), він заміняє його на послідовність_ символів. Будь-які входження макросу, виявлені в рядках символів, символьних константах або в коментарях, заміні не підлягають.
Можна скасувати визначення макросу директивою #undef:
#undef ім'я_макросу
Даний рядок видаляє кожний раніше введений рядок заміщення. Визначення макросу губиться і ім'я_макросу стає невизначеним.
Приклад:
#define МАХ 100
Це значення буде підставлятися щораз замість макросу МАХ у вихідному файлі. Можна також використовувати макрос замість строкової константи:
Якщо послідовність символів у директиві #define не міститься в одному рядку, то можна поставити наприкінці рядка символ \ і продовжувати послідовність на іншому рядку:
#define STRING "Ця послідовність символів не \ уміщається на одному рядку, ми використовуємо два рядки"
Серед програмістів прийнята угода, що для імені макросу використовуються, як правило, ідентифікатори з прописних букв. Ця угода дозволяє легко знаходити в тексті програми макроси. Також, краще всі директиви #define виносити в початок файлу або в окремий файл заголовку.
Найбільше часто директива #define використовується для визначення імен "магічних чисел", що зустрічаються в програмі. Наприклад, якщо ви задаєте один розмір масивів у програмі й у деяких підпрограмах використовуєте масиви того ж розміру, те більш доцільно визначити розмір масиву директивою #define і використовувати в оголошеннях масивів цей макрос.
Приклад:
#define МАХ 100
float bа1аnсе[МАХ], sа1dо[МАХ]:
Директива #define має ще одну важливу особливість: макрос може мати аргументи. Щоразу, коли відбувається заміна, аргументи також заміняються на ті, котрі зустрічаються в програмі. Ілюстрацією може служити наступний приклад:
#define МIМ(а,b) ((а)<(b))?(а):(Ь)
…
printf(" Мінімум із х та у %d, МІN(х,у));
printf(“ Мінімум із а та b %d, МІN(m,n));
…
Коли програма буде компілюватися, у вираз, визначений як МІN(а, b), будуть підставлені відповідно х та у або m та n. Аргументи а та b в круглих дужках, тому що замість них може підставлятися деякий вираз, а не просто ідентифікатори, наприклад
printf(“Мінімум %d, МІN(х*х, х*х*х));
Дата добавления: 2015-07-20; просмотров: 71 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
ЗАВДАННЯ ПО ОБРОБЦІ РЯДКІВ | | | If, #else, #elif, #endif. |