C Препроцессор и макросы
Препроцессор C и макросы
В этом руководстве вы познакомитесь с препроцессорами c и научитесь использовать #include, #define и условную компиляцию с помощью примеров.
<рисунок>Препроцессор C — это препроцессор макросов (позволяет определять макросы), который преобразует вашу программу перед ее компиляцией. Этими преобразованиями могут быть включение заголовочного файла, расширение макросов и т. д.
Все директивы предварительной обработки начинаются с #
. символ. Например,
#define PI 3.14
Некоторые из распространенных применений препроцессора C:
<час>Включение файлов заголовков:#include
#include
препроцессор используется для включения заголовочных файлов в программы на C. Например,
#include <stdio.h>
Здесь stdio.h
является заголовочным файлом. #include
директива препроцессора заменяет вышеуказанную строку содержимым stdio.h
файл заголовка.
Вот почему вам нужно использовать #include <stdio.h>
прежде чем вы сможете использовать такие функции, как scanf()
и printf()
.
Вы также можете создать свой собственный заголовочный файл, содержащий объявление функции, и включить его в свою программу, используя эту директиву препроцессора.
#include "my_header.h"
Посетите эту страницу, чтобы узнать больше об использовании файлов заголовков.
<час>Макросы с использованием #define
Макрос — это фрагмент кода, которому присвоено имя. Вы можете определить макрос в C, используя #define
директива препроцессора.
Вот пример.
#define c 299792458 // speed of light
Здесь, когда мы используем c в нашей программе он заменен на 299792458
.
Пример 1:препроцессор #define
#include <stdio.h>
#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 <stdio.h>
#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
и #elif
используются директивы.
Директива #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 <stdio.h>
int main()
{
printf("Current time: %s",__TIME__);
}
Вывод
Current time: 19:54:39<час>
Рекомендуемая литература
- Управление линией
- Прагмы
- Вывод препроцессора
- Другие директивы
Язык C