C Препроцесор і макроси

У цьому підручнику ви познайомитесь із препроцесорами c, і ви навчитесь використовувати #include, #define та умовну компіляцію за допомогою прикладів.

Препроцесор C - це макропроцесор (дозволяє визначити макроси), який перетворює вашу програму до її компіляції. Ці перетворення можуть бути включенням файлу заголовка, розширенням макросів тощо.

Усі директиви попередньої обробки починаються з #символу. Наприклад,

 #define PI 3.14

Деякі з найпоширеніших застосувань препроцесора C:

Включаючи файли заголовків: #include

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

 #include 

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

Ось чому вам потрібно використовувати, #include перш ніж ви зможете використовувати такі функції, як scanf()і printf().

Ви також можете створити власний файл заголовка, що містить декларацію функції, і включити його у свою програму, використовуючи цю директиву препроцесора.

 #include "my_header.h"

Відвідайте цю сторінку, щоб дізнатись більше про використання файлів заголовків.

Макроси з використанням #define

Макрос - це фрагмент коду, якому присвоєно ім’я. Ви можете визначити макрос на мові C, використовуючи #defineдирективу препроцесора.

Ось приклад.

 #define c 299792458 // speed of light

Тут, коли ми використовуємо c у нашій програмі, він замінюється на 299792458.

Приклад 1: #define препроцесор

 #include #define PI 3.1415 int main() ( float radius, area; printf("Enter the radius: "); scanf("%f", &radius); // Notice, the use of PI area = PI*radius*radius; printf("Area=%.2f",area); return 0; )

Функціонує як макроси

Ви також можете визначити макроси, які працюють подібним чином, як виклик функції. Це відоме як функціональні макроси. Наприклад,

 #define circleArea(r) (3.1415*(r)*(r))

Щоразу, коли програма стикається circleArea(argument), вона замінюється на (3.1415*(argument)*(argument)).

Припустимо, ми передали 5 як аргумент, тоді він розширюється, як показано нижче:

 circleArea(5) expands to (3.1415*5*5)

Приклад 2: Використання #define препроцесора

 #include #define PI 3.1415 #define circleArea(r) (PI*r*r) int main() ( float radius, area; printf("Enter the radius: "); scanf("%f", &radius); area = circleArea(radius); printf("Area = %.2f", area); return 0; )

Відвідайте цю сторінку, щоб дізнатись більше про макроси та #define препроцесор.

Умовна компіляція

У програмуванні на С ви можете вказати препроцесору, включати блок коду чи ні. Для цього можна використовувати умовні директиви.

Це схоже на ifтвердження з однією великою різницею.

Оператор ifперевіряється під час виконання, щоб перевірити, чи слід виконувати блок коду чи ні, тоді як умови використовуються для включення (або пропуску) блоку коду до вашої програми перед виконанням.

Використання умовного

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

Як використовувати умовний?

Щоб використовувати умовне, #ifdef, #if, #defined, #elseі #elseifвикористовуються директиви.

Директива #ifdef

 #ifdef MACRO // conditional codes #endif 

Тут умовні коди включаються в програму, лише якщо визначено MACRO.

#if, #elif та #else Директива

 #if expression // conditional codes #endif 

Тут вираз - це вираз цілочисельного типу (це можуть бути цілі числа, символи, арифметичний вираз, макроси тощо).

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

Необов'язкову #elseдирективу можна використовувати з #ifдирективою.

 #if expression conditional codes if expression is non-zero #else conditional if expression is 0 #endif 

Ви також можете додати вкладені умовні до вашого #if… #elseвикористання#elif

 #if expression // conditional codes if expression is non-zero #elif expression1 // conditional codes if expression is non-zero #elif expression2 // conditional codes if expression is non-zero #else // conditional if all expressions are 0 #endif 

#визначений

Спеціальний оператор #defined використовується для перевірки визначеності певного макросу чи ні. Він часто використовується з директивою #if.

 #if defined BUFFER_SIZE && BUFFER_SIZE>= 2048 // codes 

Попередньо визначені макроси

Ось кілька визначених макросів у програмуванні на C.

Макрос Значення
__DATE__ Рядок, що містить поточну дату
__FILE__ Рядок, що містить ім'я файлу
__LINE__ Ціле число, що представляє номер поточного рядка
__STDC__ Якщо відповідає стандарту ANSI C, тоді значення є ненульовим цілим числом
__TIME__ Рядок, що містить поточну дату.

Приклад 3: Отримати поточний час за допомогою __TIME__

Наступна програма виводить поточний час за допомогою __TIME__макросу.

 #include int main() ( printf("Current time: %s",__TIME__); )

Вихідні дані

 Поточний час: 19:54:39

Рекомендовані читання

  • Управління лінією
  • Прагми
  • Вихід попереднього процесора
  • Інші директиви

Цікаві статті...