мета-данные страницы
Это старая версия документа!
препроцессор
Препроцессор имеет следующие директивы:
#define- определяет макрос или препроцессорный идентификатор#undef- отменяет определение макроса или идентификатора#ifdef- проверяет, определен ли идентификатор#ifndef- проверяет неопределенность идентификатора#include- включает текст из файла#if- проверяет условие выражения (как условная конструкция if)#else- задает альтернативное условие для #if#endif- окончание условной директивы #if#elif- задает альтернативное условие для #if#line- меняет номер следующей ниже строки#error- формирует текст сообщения об ошибке трансляции#pragma- определяет действия, которые зависят от конкретной реализацией компилятора#- пустая директива, по сути ничего не делает
#define
определяет идентификатор и последовательность символов, которые будут подставляться вместо идентификатора каждый раз, когда он встретится в исходном файле
#include <stdio.h> #define BEGIN { #define END } #define N 23 #define ADD(a,b) (a+b) int main(void) BEGIN int x = N; printf("Number: %d", x); // Number: 23 printf("%d + %d = %d", 10, 5, ADD(10, 5)); // 10 + 5 = 15 return 0; END
Следует учитывать, что директива препроцессор не заменяет последовательности символов в двойных и одинарных кавычках и в комментариях
#undef
undef отменяет действие макроcа define
#include <stdio.h> #define STRING "Good morning \n" int main(void) { printf(STRING); #undef STRING #define STRING "Good afternoon \n" printf(STRING); #undef STRING #define STRING "Good evening \n" printf(STRING); return 0; }
#ifdef
Директива #ifdef проверяет, определен ли идентификатор. Если он определен, выполняется соответствующий код.
#include <stdio.h> #define FEATURE_ENABLED int main(void) { #ifdef FEATURE_ENABLED printf("Feature is enabled.\n"); // Этот код будет выполнен #else printf("Feature is disabled.\n"); #endif return 0; }
Если `FEATURE_ENABLED` будет отменен, код в первом блоке не выполнится.
#ifndef
работает аналогично #ifdef, но проверяет ложность уловия
#include
Эта директива подключает в исходный текст указанного файла.
#include <имя_файла> // поиск файла в стандартных системных каталогах #include "имя_файла" // поиск файла в директории с заголовочниками (определено компилятором)
#if
Директива #if проверяет условие выражения, аналогично конструкции if в языке C.
#include <stdio.h> #define VERSION 2 int main(void) { #if VERSION == 1 printf("Version 1\n"); #elif VERSION == 2 printf("Version 2\n"); // Этот код будет выполнен #else printf("Unknown version\n"); #endif return 0; }
#else
Директива #else задает альтернативное условие для директивы #if. Если предыдущее условие не было выполнено, выполняется код под #else.
#endif
Директива #endif завершает условную блокировку, начатую с #if, #ifdef или #ifndef.
#elif
Директива #elif позволяет задавать дополнительные условия в цепочке условных проверок, что обеспечивает удобство структурирования кода.
#line
Директива #line позволяет изменять номер строки и имя файла для отчетов об ошибках, которые выводит компилятор.
#include <stdio.h> #line 100 "custom_file.c" // Устанавливает номер строки и имя файла int main(void) { printf("Hello from line %d of %s\n", __LINE__, __FILE__); return 0; }
#error
Директива #error заставляет компилятор выдавать сообщение об ошибке и завершать процесс компиляции.
#include <stdio.h> #ifndef REQUIRED_FEATURE #error "Required feature is not defined!" #endif int main(void) { printf("Program runs successfully.\n"); return 0; }
#pragma
Директива #pragma используется для передачи специальных инструкций компилятору. Эти инструкции зависят от конкретного компилятора и могут варьироваться.
#include <stdio.h> #pragma message("Compiling the program...") // Выводит сообщение во время компиляции int main(void) { printf("Hello, World!\n"); return 0; }
#
Пустая директива # не выполняет никаких действий, но может использоваться для организации или форматирования кода.