Введение в директивы препроцессора в C

Чаще всего ошибочно считают, что препроцессоры или макросы являются частью компиляции программы, но это совершенно неверно. Директивы препроцессора являются типом макросов и фазой перед компиляцией. Можно сказать, что это некоторый набор инструкций, данных компилятору для выполнения фактической компиляции. Они также известны как более длинные конструктивные сокращения для макросов, что означает, что значение в макросах заменяется сегментом кодов. Макрос определяется специальным символом и имеет символ, начинающийся с «#». Поэтому эти # define являются своего рода специальным препроцессором, за которым следует фактический компилятор. В этой теме мы узнаем о директивах препроцессора в C.

Препроцессор имеет специальный тип представления для своей идентификации, как любая директива препроцессора инициирует себя специальным символом «#», за которым следует идентификатор, а затем имя директивы. Пробелы также разрешены до и после #. Например, # include.

Существуют определенные варианты или возможности, которые может обеспечить препроцессор C:

  • Заголовочные файлы. Включение заголовочных файлов - это способ, которым объявления могут быть заменены синтаксисом и телом программы.
  • Расширение макроса. Определение макросов похоже на сокращение фрагмента кода, который препроцессор C заменяет макрокомандами с их соответствующим определением.
  • Компиляция по условиям: согласно различным сценариям или различным условиям включение определенных частей программы возможно путем условной компиляции.
  • Линейное управление: если вы используете программу для объединения или перестановки кого-либо или нескольких исходных файлов в промежуточный файл для компиляции, вы можете использовать линейный контроль для информирования компилятора о том, откуда каждая исходная строка происходит.

Типы препроцессорных директив

Все типы директив препроцессора следующие:

  1. # определить
  2. # включают
  3. # ifdef
  4. # undef
  5. #ifndef
  6. # если
  7. #else
  8. #elif
  9. #endif
  10. #ошибка
  11. #pragma

1. #define (Макросы)

Макрос - это фрагмент кода, который заменяется некоторым значением кода макроса. Любой макрос в основном описывается и определяется его директивой #define.

Синтаксис:

#define token value

Существует два типа макросов:

  • Функциональные макросы
  • Объект - как макросы
Функциональные макросы

Функция like-macro работает почти как вызов функции.

Например:

#define MAX(a, b) ((a)>(b) ? (a): (b))

Макс здесь имя макроса.

Пример:

Выход:

Объект - как макросы

Объектоподобные макросы - это тип идентификатора, заменяемый значением. Он в основном используется для представления числовых констант.

#define PI 3.1415

Здесь значение PI будет заменено макросом.


Выход:

2. #include

Существует некоторая другая функциональность для директивы include препроцессора. Он имеет три собственных варианта, которые заменяют код на текущий код исходного файла.

Три варианта заключаются в следующем:

  • #включают
  • #include»файл»
  • Включите что-нибудь еще

#включают

Выполняет поиск файла в определенном списке системы или каталогов, как указано, затем ищет стандартный список системных библиотек.

#include»файл»

Этот тип используется для ваших собственных настраиваемых заголовочных файлов программы. Сначала выполняется поиск файла с именем file в текущем каталоге, за которым следуют файлы системных заголовков и текущие каталоги текущего файла каталога.

# включить что-нибудь

Этот тип директивы препроцессора include используется, когда ни один из двух оставшихся двух типов директивы и ее аргументов не соответствуют и не удовлетворяют структуре вычислений.

3. #Ifdef

Проверяет, определен ли макрос с помощью # define или нет. Если да, он выполнит код, иначе не будет.

Синтаксис:

#ifdef MACRO
(
Code body
)
#endif
#undef:

Отмена определения макроса означает, что он не определен и ему предшествует директива #undef.

Синтаксис:

#undef token

Выход:

4. Ифндеф

Этот процессор проверяет, определен ли #define или нет #define. Если да, он выполняет код.

Синтаксис:

#Ifndef MACRO
//code
#endif
#If

Этот процессор работает только как цикл if, он оценивает выражение или условие. Если условие id истинно, он будет выполнять код, иначе нет.

Синтаксис:

#if expression
//code
#endif
#else

Директива препроцессора #else используется для оценки выражения или условия, если условие #if ложно. Его можно использовать с директивами #if, #elif, #ifdef и #ifndef.

Синтаксис:

#if expression
//if body
#else
//else body
#endif

Пример:

Выход:

5. # Ошибка

Как следует из названия, директива препроцессора Error используется для указания ошибки, а затем компилятор выдает фатальную ошибку, если директива error найдена, и пропускает следующие шаги компиляции.

Выход:

6. #pragma

Это зависит от компилятора, поскольку разные ОС и разные машины предоставляют все типы функций операционной системы, которые используются компилятором для предоставления компилятору дополнительной информации.

Синтаксис:

#pragma token

Пример:

Выход:

Каждый препроцессор имеет свое значение, например, условная директива используется для проверки того, следует ли учитывать часть программы на основе сценариев или нет.

Предположим, что программа хочет быть скомпилированной в указанной среде с определенной конфигурацией операционной системы, но как только она переходит на эту фазу компиляции, она выдает ошибку или может дать неверный код, просто давая своей программе возможность большого отказа. связать программу и запустить ее во время выполнения. Также может существовать другая возможность, когда один и тот же исходный файл с двумя разными программами может выполнить длительную проверку согласованности или непосредственных данных или распечатать значения данных с отладкой.

Кроме того, эти сценарии, создаваемые с помощью вычислений, также можно использовать для запуска на одном компьютере с использованием директив предварительной обработки.

Вывод

Выходные данные препроцессора C очень похожи на входные данные, за исключением того, что все директивы предварительной обработки были заменены пустыми строками или пробелами. Разные файлы и форматы имеют разные синтаксисы, говорящие о том, что был создан новый файл, или указывающие на возврат к файлу, или обработку следует выполнить перед компиляцией.

Все сценарии используются для того, чтобы рассказать другим о возможностях препроцессора C и о том, как он развивается с различными версиями компилятора, запущенными со стандартами GCC и ANSI.

Рекомендуемые статьи

Это руководство по директивам препроцессора в C. Здесь мы обсуждаем типы директив препроцессора с синтаксисом и примерами. Вы также можете взглянуть на следующие статьи, чтобы узнать больше

  1. Обратный номер в C
  2. Сортировка в C
  3. Функция хеширования в C
  4. Продолжить заявление в C
  5. Сортировка в C #
  6. Как работает функция хеширования в php?