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

Как использовать препроцессор C

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

Он анализирует нашу программу и проверяет, получает ли компилятор все необходимое, прежде чем продолжить процесс.

Что он делает на практике?

Например, он ищет все файлы заголовков, которые вы включаете с#includeдиректива.

Он также проверяет каждую константу, которую вы определили с помощью#defineи заменяет его действительным значением.

Это только начало, и я упомянул эти две операции, потому что они самые распространенные. Препроцессор может намного больше.

Ты заметил#includeи#defineесть#в начале? Это общее для всех директив препроцессора. Если строка начинается с#, об этом позаботился препроцессор.

Условные

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

Например, мы можем проверить, есть лиDEBUGконстанта равна 0:

#include <stdio.h>

const int DEBUG = 0;

int main(void) { #if DEBUG == 0 printf(“I am NOT debugging\n); #else printf(“I am debugging\n); #endif }

Символьные константы

Мы можем определитьсимволическая константа:

#define VALUE 1
#define PI 3.14
#define NAME "Flavio"

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

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

Макросы

С#defineмы также можем определитьмакрос. Разница между макросом и символьной константой заключается в том, что макрос может принимать аргумент и обычно содержит код, а символьная константа - это значение:

#define POWER(x) ((x) * (x))

Обратите внимание на круглые скобки вокруг аргументов - это хороший способ избежать проблем при замене макроса в процессе предварительной компиляции.

Затем мы можем использовать это в нашем коде следующим образом:

printf("%u\n", POWER(4)); //16

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

Если определено

Мы можем проверить, определена ли символическая константа или макрос, используя#ifdef:

#include <stdio.h>
#define VALUE 1

int main(void) {
#ifdef VALUE
  printf("Value is defined\n");
#else
  printf("Value is not defined\n");
#endif
}

У нас также есть#ifndefчтобы проверить обратное (макрос не определен).

Мы также можем использовать#if definedи#if !definedвыполнить ту же задачу.

Обычно некоторый блок кода помещают в такой блок:

#if 0

#endif

чтобы временно предотвратить его запуск или использовать символическую константу DEBUG:

#define DEBUG 0

#if DEBUG
  //code only sent to the compiler
  //if DEBUG is not 0
#endif

Предопределенные символьные константы, которые вы можете использовать

Препроцессор также определяет ряд символических констант, которые вы можете использовать, обозначенных двумя символами подчеркивания до и после имени, в том числе:

  • __LINE__переводится в текущую строку в файле исходного кода
  • __FILE__переводится как имя файла
  • __DATE__переводится на дату компиляции, вMmm gg aaaaформат
  • __TIME__переводится во время компиляции, вhh:mm:ssформат

Скачать мою бесплатнуюСправочник C


Больше уроков по clang: