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

В този урок ще се запознаете с c препроцесори и ще се научите да използвате #include, #define и условна компилация с помощта на примери.

Препроцесорът C е макропроцесор (позволява ви да дефинирате макроси), който преобразува вашата програма, преди да бъде компилирана. Тези трансформации могат да бъдат включване на заглавен файл, разширения на макроси и т.н.

Всички директиви за предварителна обработка започват със #символ. Например,

 #define PI 3.14

Някои от често срещаните приложения на C препроцесора са:

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

В #includeПрепроцесорът се използва за включване на заглавни файлове на програми C. Например,

 #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 препроцесор.

Условна компилация

При програмирането на C можете да инструктирате препроцесора дали да включва блок код или не. За целта могат да се използват условни директиви.

Подобно е на 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

Специалният оператор #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

Препоръчителни четива

  • Контрол на линията
  • Прагми
  • Изход на препроцесор
  • Други директиви

Интересни статии...