8-900-374-94-44
[email protected]
Slide Image
Меню

Директивы препроцессора: Директивы препроцессора | Microsoft Learn

Директивы препроцессора | Microsoft Learn

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья

Директивы препроцессора, такие как

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

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

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

#define
#elif
#else
#endif

#error
#if
#ifdef
#ifndef

#import
#include
#line

#pragma
#undef
#using

Знак решетки ( # ) должен быть первым символом, не пробелом, в строке, содержащей директиву. Символы пробела могут находиться между знаком номера и первой буквой директивы. Некоторые директивы содержат аргументы или значения. Любой текст, следующий за директивой (за исключением аргумента или значения, который является частью директивы), должен предшествовать разделителю однострочных комментариев ( // ) или заключены в разделители комментариев ( /* */

). Строки, содержащие директивы препроцессора, могут быть продолжены непосредственно перед маркером конца строки с обратной косой чертой ( \ ).

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

Операторы препроцессора
Предустановленные макросы
Справочник по препроцессору c/c++

Postgres Pro Enterprise : Документация: 11: 37.9. Директивы препроцессора : Компания Postgres Professional

RU
EN
RU EN

37. 9.1. Включение файлов
37.9.2. Директивы define и undef
37.9.3. Директивы ifdef, ifndef, else, elif и endif

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

37.9.1. Включение файлов

Для включения внешнего файла в программу со встраиваемым SQL, используется конструкция:

EXEC SQL INCLUDE имя_файла;
EXEC SQL INCLUDE <имя_файла>;
EXEC SQL INCLUDE "имя_файла";

Встретив такую директиву, препроцессор встраиваемого SQL будет искать файл имя_файла.h, обрабатывать его и включать в выходной код C. В результате встраиваемые SQL-операторы во включённом таким образом файле будут обработаны корректно.

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

  • текущий каталог
  • /usr/local/include
  • каталог включаемых файлов Postgres Pro, определённый во время сборки (например, /usr/local/pgsql/include)
  • /usr/include

Но когда используется форма EXEC SQL INCLUDE "имя_файла", просматривается только текущий каталог.

В каждом каталоге препроцессор будет сначала искать файл с заданным именем, а если не обнаружит его, попытается найти файл с добавленным расширением .h (если только заданное имя файла уже не содержит это расширение).

Заметьте, что команда EXEC SQL INCLUDE не равнозначна включению:

#include <имя_файла.h>

так как во втором случае включаемый файл не проходит через препроцессор SQL-команд. Естественно, директиву C #include можно по-прежнему применять для включения других заголовочных файлов.

Примечание

Имя включаемого файла чувствительно к регистру, несмотря на то, что остальная команда EXEC SQL INCLUDE подчиняется обычным правилам чувствительности к регистру SQL.

37.9.2. Директивы define и undef

Во встраиваемом SQL есть конструкция, подобная директиве #define, известной в C:

EXEC SQL DEFINE имя;
EXEC SQL DEFINE имя значение;

Используя её, можно определить имя:

EXEC SQL DEFINE HAVE_FEATURE;

И также можно определить константы:

EXEC SQL DEFINE MYNUMBER 12;
EXEC SQL DEFINE MYSTRING 'abc';

Удалить предыдущее определение позволяет команда undef:

EXEC SQL UNDEF MYNUMBER;

Разумеется, в программе со встраиваемым SQL можно продолжать использовать версии #define и #undef языка C. Отличие состоит в том, когда вычисляются определяемые значения. Когда применяется команда EXEC SQL DEFINE, вычислять определения и подставлять значения будет препроцессор ecpg. Например, если написать:

EXEC SQL DEFINE MYNUMBER 12;
...
EXEC SQL UPDATE Tbl SET col = MYNUMBER;

подстановку выполнит ecpg и компилятор C никогда не увидит имени или идентификатора MYNUMBER. Заметьте, что с другой стороны

#define не подходит для определения константы, которую вы хотите использовать во встраиваемом SQL, так как препроцессор встраиваемого SQL не сможет увидеть это определение.

37.9.3. Директивы ifdef, ifndef, else, elif и endif

Для условной компиляции блоков кода можно использовать следующие указания:

EXEC SQL ifdef имя;

Проверяет имя и обрабатывает последующие строки, если имя было определено командой EXEC SQL define имя.

EXEC SQL ifndef имя;

Проверяет имя и обрабатывает последующие строки, если имя не было определено командой EXEC SQL define имя.

EXEC SQL else;

Начинает альтернативную ветвь условия, открытого командой EXEC SQL ifdef имя или EXEC SQL ifndef имя.

EXEC SQL elif имя;

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

EXEC SQL endif;

Завершает ветвь условия.

Пример:

EXEC SQL ifndef TZVAR;
EXEC SQL SET TIMEZONE TO 'GMT';
EXEC SQL elif TZNAME;
EXEC SQL SET TIMEZONE TO TZNAME;
EXEC SQL else;
EXEC SQL SET TIMEZONE TO TZVAR;
EXEC SQL endif;

директив препроцессора | Microsoft Узнайте

Редактировать

Твиттер LinkedIn Фейсбук Электронная почта

  • Статья

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

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

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

#define
#elif
#else
#endif

#ошибка
#if
#ifdef
#ifndef

#import
#include
#line

#pragma
#undef
# использование

Знак числа ( # ) должен быть первым непробельным символом в строке, содержащей директиву. Между знаком номера и первой буквой директивы могут появляться пробельные символы. Некоторые директивы включают аргументы или значения. Любому тексту, который следует за директивой (за исключением аргумента или значения, являющегося частью директивы), должен предшествовать однострочный разделитель комментария (

// ) или заключены в разделители комментариев ( /* */ ). Строки, содержащие директивы препроцессора, могут быть продолжены, если непосредственно перед маркером конца строки поставить обратную косую черту ( \ ).

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

См. также

Операторы препроцессора
Предопределенные макросы
Справочник по препроцессору c/c++

Обратная связь

Просмотреть все отзывы о странице

Препроцессор — cppreference.

com

Язык C++

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

9 0016 Препроцессор выполняется на этапе трансляции 4 перед компиляцией. Результатом предварительной обработки является один файл, который затем передается фактическому компилятору.

  • 1 Директивы
  • 2 Возможности
  • 3 Отчеты о дефектах
  • 4 См. также

[править] Директивы

Директивы препроцессора управляют поведением препроцессора. Каждая директива занимает одну строку и имеет следующий формат:

  • символ #
  • последовательность:
  • стандартное имя директивы (перечисленное ниже), за которым следуют соответствующие аргументы, или
  • один или несколько токенов предварительной обработки, где начальный токен не является стандартным именем директивы, в этом случае директива поддерживается условно с семантикой, определяемой реализацией (например, общим нестандартным расширением является директива #warning, которая выдает определяемое пользователем сообщение во время компиляции) (до C++23) или
  • ничего, в этом случае директива не действует.
  • разрыв строки.

Директивы модуля и импорта также являются директивами предварительной обработки.

(начиная с C++20)

Директивы предварительной обработки не должны исходить из раскрытия макросов.

 #define ПУСТОЙ
EMPTY # include  // не директива препроцессора 

[edit] Capabilities

Препроцессор имеет возможности перевода исходного файла:

  • условно компилировать части исходного файла (управляется директивами #if, #ifdef, #ifndef, #else, #elif, #elifdef, #elifndef (начиная с C++23) и #endif).
  • заменяет текстовые макросы при возможном объединении или цитировании идентификаторов (управляется директивами #define и #undef и операторами # и ##)
  • включают других файлов (контролируются директивой #include и проверяются с помощью __has_include (начиная с C++17))
  • вызывает ошибку или предупреждение (начиная с C++23) (управляется директивой #error или #warning соответственно (начиная с C++23))

Можно управлять следующими аспектами препроцессора: