C: Препроцессор

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

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

Объявления макросов обычно размещаются в начале файла исходного кода программы.

#define MAXCONNECTIONS 10

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

#undef

При необходимости объявление макроса может быть аннулировано. Для установки нового значения макроса его объявление должно быть аннулировано.

#undef ITEMS

#include

Директива препроцессора include уже не раз использовалась в примерах. Она имеет два формата.

#include <file.h>
#include "file.h"

При использовании скобок (#include <file.h>) компилятор ищет заголовочный файл file.h и подключает его к коду программы. В случае использования кавычек (#include "file.h") заголовочный файл для подключения к коду программы ищется в текущей директории. Директива препроцессора #include обычно используется для подключения к коду программы заголовочного файла, а не файла исходного кода.

#ifdef / #ifndef

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

#ifdef linux
  #define AVAILABLE 64
#else
  #define AVAILABLE 32
#endif

Также имеется возможность использования условной инструкции с отрицанием.

#ifndef windows
  #define MEMORY 128
#else
  #define MEMORY 192
#endif

Установка значений макросов может осуществляться на этапе вызова компилятора путем использования параметра -D; в этом случае они будут обрабатываться также, как и макросы из файлов исходного кода.

gcc -DLINELENGTH=80 myprogram.c

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

Пример

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

  1. #include <stdio.h>
  2.  
  3. #define TELEPHONE 5550123
  4.  
  5. int main()
  6. {
  7.     printf("%in", TELEPHONE);
  8.  
  9.     return 0;
  10. }

Загрузить исходный код примера