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

C условная компиляция: С | Условная компиляция

Условная компиляция | это… Что такое Условная компиляция?

Расширение языка

Отличными примерами расширения языка при помощи макросов может служить их использование в семействе языков программирования Лисп. В то время как эти языки сами по себе имеют простые ядра, ориентированные на динамические типы, стандартные поставки Схема, императивы Common Lisp, объектно-ориентированное программирование ориентированы на статические типы. Почти все эти свойства реализованы синтаксическими препроцессорами, хотя это несет в себе отпечаток этапа компиляции «расширения макросами», управляемой компилятором Лисп. Это все еще может считаться формой препроцессорной обработки, так как это происходит перед остальными этапами компиляции.

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

Специализированный язык

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

Обычно, в большом количестве проектов, написанных на языке Лисп, модуль может быть написан на множестве подобных миниязыков, то есть, один может использовать Лисп, а другой может быть написан на диалекте, ориентированном на графический интерфейс пользователя или вывод на принтер и т. д. Стандартная библиотека Common Lisp содержит пример такого уровня синтаксической абстракции в виде макроса LOOP, который реализует Алголоподобные миниязыки для описания комплексной итерации, при сохранении возможности использовать стандартные операторы Лисп.

Препроцессор/язык MetaOCaml обеспечивает схожие возможности и для внешнего предметно-ориентированного языка программирования. Этот препроцессор получая описание семантики языка (т. н. интерпретация) и комбинируя интерпретацию во время компиляции и генерации кода, передает это определение компилятору языка

Макропроцессор общего назначения

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

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

Макропроцессор m4 вероятно наиболее известный пример подобного макропроцесора общего назначения.

Примеры

  • применение препроцессора Си для препроцессинга Javascript-кода [1].
  • применение M4 (смотри пример в статье) или препроцессора Си [2] в качестве движка шаблонов для генерации imake, интерфейс препроцессор Си, задействованный X Window System, но в настоящее время происходит отказ этого в пользу вычислительной химии), использующий препроцессор Си (или другой препроцессор, определенный вводным файлом) для проверки разметки, применяя преимущественно механизмы
#define

и

#include

для создания эффективной разметки при работе grompp.

Смотри также

Посмотрите «preprocessor» в Викисловаре, свободном словаре.

11.3 Условная Компиляция. C++

11.3 Условная Компиляция. C++

ВикиЧтение

C++
Хилл Мюррей

Содержание

11.3 Условная Компиляция

Командная строка компилятора вида

#if выражение

проверяет, является ли результатом вычисления выражения не-ноль. Выражение должно быть константным выражением, котрые обсуждаются в #12. Кроме обычных операций С++ может ипользоваться унарная операция defined. При применении к идетификатору она дает значение не-ноль, если этот идентификатор был ранее определен с помощью #define и после этого не было отмены определения с помощью #undef; иначе ее значение 0. Командная строка вида

#ifdef идентификатор

проверяет, определен ли идентификатор в препроцессоре в данный момент; то есть, был ли он объектом командной строки # define. Командная строка вида

#ifndef идентификатор

проверяет, является ли идентификатор неопределенным в препроцессоре в данный момент.

После каждого из трех видов может стоять произвольное количество строк, возможно, содержащих командную строку

#else

и далее до командной строки

#endif

Если проверенное условие истинно, то все строки между #else и #endif игнорируются. Если проверенное условие ложно, то все строки между проверкой и #else или, в случае отсуттвия #else, #endif, игнорируются.

Эти конструкции могут быть вложенными.

15.2. Компиляция для отладки

15.2. Компиляция для отладки Для использования отладчика исходного кода, отлаживаемый исполняемый файл должен быть откомпилирован с опцией компилятора -g. Эта опция заставляет компилятор внедрять в объектный код дополнительные отладочные идентификаторы; то есть

Условная переменная

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

Компиляция

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

8.5. Условная подстановка параметров

8.5. Условная подстановка параметров Условная подстановка позволяет проверить, установлен ли определенный параметр, или использовать вместо его значения другое. Значение самого параметра при этом не изменяется. Допустимые виды условных подстановок перечислены в

28.2. Компиляция модуля

28.2. Компиляция модуля Компилировать мы будем файл module.

c. Для этого понадобится установленный компилятор gcc, заголовочные файлы и исходные тексты ядра. Если вы дочитали книгу до этой главы, то у вас уже должны быть установлены пакеты:1. cpp — препроцессор cpp;2. binutils — набор

3.4.3. Компиляция

3.4.3. Компиляция Как правило, исходные коды программ распространяются в виде архива с «двойным расширением» -.tar.gz. Исходный код принято распаковывать в каталог /usr/src. Поэтому для распаковки архива вам нужно выполнить следующие команды:sucd /usr/srcgunzip архив.tar.gztar xvf

R.16.5 Условная трансляция

R.16.5 Условная трансляция С помощью препроцессора можно организовать условную трансляцию программы. Синтаксически это задается следующим образом:условное: часть-if части-elif opt часть-else opt строка-endifчасть-if: строка-if текстстрока-if: # if выражение-константа # ifdef

Компиляция программ

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

Почему компиляция?

Почему компиляция? Читатели, пользовавшиеся языком Бейсик, могут удивиться, зачем столько шагов для того, чтобы выполнить программу. Кажется, что такой способ компиляции требует больше времени (и в некоторых случаях это может быть действительно так). Но, поскольку в

Условная операция

Условная операция В языке Си имеется одна тернарная операция — уловная. Она имеет следующий синтаксис:<операнд1> ? <операнд2>: <операнд3>Выражение <операнд1> вычисляется и сравнивается с нулем. Выражение может иметь целый, плавающий тип, либо быть указателем.

Условная компиляция

Условная компиляция В этом разделе описываются директивы, которые управляют условной компиляцией. Эти директивы позволяют исключить из процесса компиляции какие-либо части исходного файла посредством проверки условий (константных

Условная обработка

Условная обработка В XSLT имеются две инструкции, которые поддерживают условную обработку — xsl:if и xsl:choose. Инструкция xsl:if позволяет создавать простые условия типа «если-то», в то время как xsl:choose создает более сложную конструкцию для выбора одной из нескольких имеющихся

1.1.2 Компиляция

1.1.2 Компиляция Откуда появились выходной поток cout и код, реализующий операцию вывода ««? Для получения выполняемого кода написанная на С++ программа должна быть скомпилирована. По своей сути процесс компиляции такой же, как и для С, и в нем участвует большая часть входящих

7.13 Условная Операция

7. 13 Условная Операция условное_выражение: выражение ? выражение : выражениеУсловная операция группирует слева направо. Вычисляется первое выражение, и если оно не 0, то результатом является значение второго выражения, в противном случае значение третьего выражения. Если

11.3 Условная Компиляция

11.3 Условная Компиляция Командная строка компилятора вида#if выражениепроверяет, является ли результатом вычисления выражения не-ноль. Выражение должно быть константным выражением, котрые обсуждаются в #12. Кроме обычных операций С++ может ипользоваться унарная операция

Условная Инструкция (Conditional)

Условная Инструкция (Conditional) Эта инструкция задает различные формы обработки в зависимости от выполнения определенных условий. Основная форма:if boolean_expression theninstruction; instruction; …elseinstruction; instruction; . ..endгде каждая ветвь может иметь произвольное число инструкций (а возможно и не

директив препроцессора C/C++ | Комплект 2

Улучшить артикул

Сохранить статью

Нравится Статья

  • Уровень сложности: Easy
  • Последнее обновление: 11 ноя, 2022

  • Читать
  • Обсудить
  • Улучшить статью

    Сохранить статью

    Нравится Статья

    Основы директив препроцессора C/C++ Директивы препроцессора: Почти в каждой программе, с которой мы сталкиваемся на C/C++, мы видим несколько строк в верхней части программы, которым предшествует знак решетки (#). Эти строки предварительно обрабатываются компилятором перед началом фактической компиляции. Конец этих строк обозначается символом новой строки «\n», точка с запятой «;» не требуется для завершения этих строк. Директивы препроцессора в основном используются при определении макросов, оценке условных операторов, включении исходного файла, директиве pragma, управлении строкой, обнаружении ошибок и т. д. В этом посте мы обсудим еще несколько типов директив препроцессора, приведенных ниже:

    1. Условная компиляция
    2. Управление линией
    3. Директива об ошибках

    Давайте теперь подробно рассмотрим каждую из этих директив:

    • Условная компиляция : Директивы условной компиляции помогают скомпилировать определенную часть программы или позволяют пропустить компиляцию определенной части программы на основе некоторых условий. В нашей предыдущей статье мы говорили о двух таких директивах ifdef ’ и ‘ endif ’. В этом посте мы обсудим #ifndef , #if , #else и #elif .
      1. #ifdef : Эта директива является простейшей условной директивой. Этот блок называется условной группой. Контролируемый текст будет включен в вывод препроцессора, если макроимя определено. Контролируемый текст внутри условного выражения будет включать в себя директивы предварительной обработки. Они выполняются только в том случае, если условие успешно. Вы можете вложить их в несколько слоев, но они должны быть полностью вложены. Другими словами, «#endif» всегда соответствует ближайшему «#ifdef» (или «#ifndef», или «#if»). Также нельзя начинать условную группу в одном файле, а заканчивать в другом. Синтаксис:
     #ifdef МАКРОС
        контролируемый текст
    #endif /* имя макроса */ 
    1. #ifndef : Мы знаем, что директива in #ifdef, если имя макроса определено, то блок операторов, следующих за директивой #ifdef, будет выполняться нормально, но если он не определен, компилятор просто пропустит этот блок операторов. Директива #ifndef просто противоположна директиве #ifdef. В случае #ifndef блок операторов между #ifndef и #endif будет выполняться, только если макрос или идентификатор с #ifndef не определен. Синтаксис:
     ifndef имя_макроса
        заявление1;
        заявление2;
        заявление3;
        . 
        .
        .
        заявление N;
    endif 
    1. Если макрос с именем «macroname» не определен с помощью директивы #define, тогда будет выполняться только блок операторов.
    2. #if, #else и #elif : Эти директивы работают вместе и управляют компиляцией частей программы с использованием некоторых условий. Если условие с директивой #if оценивается как ненулевое значение, то группа строк сразу после директивы #if будет выполнена, в противном случае, если условие с директивой #elif оценивается как ненулевое значение, то группа строк сразу после того, как директива #elif будет выполнена, иначе будут выполнены строки после директивы #else. Синтаксис:
     #if макрос_условие
       заявления
    #элиф макрос_условие
       заявления
    #еще
       заявления
    #endif 
    1. Пример:

    CPP

    #include

    #Define GFG

    03

    #DEFIN #undef gfg

        #define gfg 200

    #elif gfg < 50

        #undef gfg

        #define gfg 50

    #else

        #undef gfg

        # Определите GFG 100

    #endif

    Int Main ()

    {

    Std :: Cout

    }   

    1. Вывод:
     50 
     50 
    1. Обратите внимание, что вся структура директивы #seifendif и #el.
    • Управление строкой ( #line ) : Всякий раз, когда мы компилируем программу, есть вероятность возникновения какой-либо ошибки в программе. Всякий раз, когда компилятор идентифицирует ошибку в программе, он предоставляет нам имя файла, в котором обнаружена ошибка, а также список строк и точные номера строк, в которых находится ошибка. Это облегчает нам поиск и исправление ошибок. Однако мы можем контролировать, какую информацию должен предоставлять компилятор при ошибках компиляции, используя директиву #line. Синтаксис:
     #номер строки "имя файла" 
    • номер – номер строки, который будет присвоен следующей строке кода. С этого момента номера строк последовательных строк будут увеличиваться один за другим. «имя файла» — необязательный параметр, позволяющий переопределить отображаемое имя файла.
    • Директива об ошибках ( #error ) : Эта директива прерывает процесс компиляции, когда она обнаруживается в программе во время компиляции, и выдает ошибку, которая является необязательной и может быть указана в качестве параметра. Синтаксис:
     #error необязательная_ошибка 
    • Здесь необязательная_ошибка — это любая ошибка, указанная пользователем, которая будет показана, когда эта директива будет найдена в программе. Пример:

    CPP

    #ifndef GeeksforGeeks

    #error GeeksforGeeks not found !

    #endif

    • Вывод:
     ошибка: #error GeeksforGeeks не найден! 

    Список литературы:

    • PPD_BETTER_PRACTICE_CS.Auckland.AC.NZ
    • http://www.cplusplus.com/doc/tutorial/preprocessor/

    Эта статья представлена ​​на 9002 9002 9002 9002 9002 9002 9002 9002 . Агарвал . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью с помощью write. geeksforgeeks.org или отправить ее по адресу [email protected]. Посмотрите, как ваша статья появится на главной странице GeeksforGeeks, и помогите другим гикам. Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.


    Нравится Статья

    Сохранить статью

    Условное включение - cppreference.com

     

     

    Язык C++

     

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

     

    Препроцессор поддерживает условную компиляцию частей исходного файла. Это поведение контролируется #if , #else , #elif , #ifdef , #ifndef , #elifdef , #elifndefsince и0103 #endif директивы.

    • 1 Синтаксис
    • 2 Пояснение
    • 3 Оценка состояния
      • 3. 1 #если, #элиф
      • 3.2 Комбинированные директивы
    • 4 Примечания
    • 5 Пример
    • 6 Отчеты о дефектах
    • 7 См. также

    [править] Синтаксис

    #if выражение
    #ifdef идентификатор
    #ifndef идентификатор
    #elif выражение
    #elifdef идентификатор (начиная с С++ 23)
    #elifndef идентификатор (начиная с С++ 23)
    #еще
    #endif

    [edit] Explanation

    The conditional preprocessing block starts with #if , #ifdef or #ifndef directive, then optionally includes any number of #elif , #elifdef , or #elifndef (начиная с C++23), затем необязательно включает не более одной директивы #else и завершается директивой #endif . Любые внутренние условные блоки предварительной обработки обрабатываются отдельно.

    Каждое из #if , #ifdef , #ifndef , #elif , #elifdef , #elifndef 4 (начиная с C++ ) и директивы #s 10seel090 управляют кодом блокировать до первой директивы #elif , #elifdef , #elifndef (начиная с C++23), #else , #endif , не принадлежащей никаким внутренним блокам условной предварительной обработки.

    #if , #ifdef и #ifndef 9Директивы 0104 проверяют указанное условие (см. ниже) и, если оно оценивается как истинное, компилируют контролируемый блок кода. В этом случае последующие директивы #else , #elifdef , #elifndef , (начиная с C++23) и #elif игнорируются. В противном случае, если указанное условие оценивается как ложное, контролируемый блок кода пропускается и последующая директива #else , #elifdef , #elifndef , (начиная с C++ 23) или #elif (если есть) обрабатывается. Если последующая директива равна #else , безоговорочно компилируется блок кода, управляемый директивой #else . В противном случае директива #elif , #elifdef или #elifndef (начиная с C++23) действует так, как если бы это была директива #if : проверяет условие, компилирует или пропускает контролируемый блок кода на основе результат, и в последнем случае обрабатывает последующие #elif , #elifdef , #elifndef , (начиная с C++23) и #else 9директивы 0104. Блок условной предварительной обработки завершается директивой #endif .

    [править] Оценка условия

    [править] #if, #elif

    Выражение может содержать:

    • унарные операторы в форме определены идентификатор или определены ( идентификатор ) . Результат равен 1, если идентификатор был определен как имя макроса, в противном случае результат равен ​0​.
    • (начиная с C++17) Выражения __has_include, которые определяют, существует ли заголовок или исходный файл.
    • (начиная с C++20) Выражения __has_cpp_attribute, определяющие, поддерживается ли данный токен атрибута, и его поддерживаемая версия.

    После всех макрорасширений и вычислений определены выражения , __has_include (начиная с C++17) и __has_cpp_attribute (начиная с C++20), любой идентификатор, который не является логическим литералом, заменяется на число ​0​ (сюда входят идентификаторы, которые лексически являются ключевыми словами, но не альтернативные токены, такие как и).

    Затем выражение оценивается как интегральное константное выражение.

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

    Примечание. До решения проблемы CWG 1955, #if cond1 ... #elif cond2 отличается от #if cond1 . .. #else , за которым следует #if cond2 , потому что if cond1 истинно, второе #если пропущено и cond2 не обязательно должен быть правильно сформированным, в то время как #elif 's cond2 должно быть допустимым выражением. Начиная с CWG 1955, #elif , ведущий к пропущенному блоку кода, также пропускается.

    [править] Комбинированные директивы

    Проверяет, был ли идентификатор определен как имя макроса. Идентификатор

    #ifdef по существу эквивалентен идентификатору #ifdefined  идентификатор. Идентификатор

    #ifndef практически эквивалентен #if !defined  идентификатор.

    Идентификатор

    #elifdef практически эквивалентен идентификатору #elif, определенному .

    #elifndef идентификатор по существу эквивалентен идентификатору #elif !defined  идентификатор.

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

    [править] Примечания

    Хотя директивы #elifdef и #elifndef нацелены на C++23, в реализациях рекомендуется использовать их для более старых языковых режимов в качестве соответствующих расширений.

    [править] Пример

     #define ABCD 2
    #include <иопоток> основной ()
    {  #ifdef ABCD
     std::cout << "1: да\n";
    #еще
     std::cout << "1: нет\n";
    #endif  #ifndef ABCD
     std::cout << "2: no1\n";
    #элиф ABCD == 2
     std::cout << "2: да\n";
    #еще
     std::cout << "2: no2\n";
    #endif  #if !defined(DCBA) && (ABCD < 2*4-3)
     std::cout << "3: да\n";
    #endif  // Обратите внимание, что если компилятор не поддерживает #elifdef/#elifndef C++23
    // директивы, то будет выбран "неожиданный" блок (см. ниже).
    #ifdef ЦП
     std::cout << "4: no1\n";
    #elifdef GPU
     std::cout << "4: no2\n";
    #elifndef ОЗУ
     std::cout << "4: да\n"; // ожидаемый блок
    #еще
     std::cout << "4: нет!\n"; // неожиданно выбирает этот блок, пропуская
     // неизвестные директивы и "прыгающие" напрямую
     // из "#ifdef CPU" в этот блок "#else"
    #endif  // Чтобы решить описанную выше проблему, мы можем условно определить
    // макрос ELIFDEF_SUPPORTED, только если директивы C++23
    // #elifdef/#elifndef поддерживаются.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *