HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <ul><li><a>Что такое препроцессор</a></li>
1 <ul><li><a>Что такое препроцессор</a></li>
2 <li><a>Синтаксис директив</a></li>
2 <li><a>Синтаксис директив</a></li>
3 <li><a>Основные директивы</a><ul><li><a>Прочие виды</a><ul><li><a>Define</a></li>
3 <li><a>Основные директивы</a><ul><li><a>Прочие виды</a><ul><li><a>Define</a></li>
4 <li><a>Error</a></li>
4 <li><a>Error</a></li>
5 <li><a>Undef</a></li>
5 <li><a>Undef</a></li>
6 <li><a>Import</a></li>
6 <li><a>Import</a></li>
7 <li><a>Using</a></li>
7 <li><a>Using</a></li>
8 <li><a>Pragma</a></li>
8 <li><a>Pragma</a></li>
9 </ul></li>
9 </ul></li>
10 <li><a>Условная компиляция</a><ul><li><a>If else</a></li>
10 <li><a>Условная компиляция</a><ul><li><a>If else</a></li>
11 <li><a>If-else-if</a></li>
11 <li><a>If-else-if</a></li>
12 <li><a>Ifdef</a></li>
12 <li><a>Ifdef</a></li>
13 </ul></li>
13 </ul></li>
14 </ul></li>
14 </ul></li>
15 </ul><p>Сегодня предстоит изучить директивы препроцессора, которые встречаются в СИ-семействе (C, C#, C++). Отдельное внимание будет уделено записям типа the if else endif, а также условной компиляции. Все это крайне важно для формирования исходного программного кода. Информация пригодятся как новичкам, так и более опытным разработчикам.</p>
15 </ul><p>Сегодня предстоит изучить директивы препроцессора, которые встречаются в СИ-семействе (C, C#, C++). Отдельное внимание будет уделено записям типа the if else endif, а также условной компиляции. Все это крайне важно для формирования исходного программного кода. Информация пригодятся как новичкам, так и более опытным разработчикам.</p>
16 <h2>Что такое препроцессор</h2>
16 <h2>Что такое препроцессор</h2>
17 <p>Изучая в the C if else endif и другие директивы, сначала необходимо выяснить, что собой представляет препроцессор. В C++ он выступает в качестве части компилятора, отвечающей за управление формированием исходного кода в объектный.</p>
17 <p>Изучая в the C if else endif и другие директивы, сначала необходимо выяснить, что собой представляет препроцессор. В C++ он выступает в качестве части компилятора, отвечающей за управление формированием исходного кода в объектный.</p>
18 <p>The preprocessor в C++ перешел в язык из своего "предшественника" - C. Он имеет некоторый набор команд, которые называются директивами. С их помощью удается управлять корректировками в трансляциях исходного кода в объектный.</p>
18 <p>The preprocessor в C++ перешел в язык из своего "предшественника" - C. Он имеет некоторый набор команд, которые называются директивами. С их помощью удается управлять корректировками в трансляциях исходного кода в объектный.</p>
19 <p>Препроцессор - специальная программа, которая отвечает за предварительную обработку текста программы. С его помощью получается включать в исходный код файлы, а также вводить разнообразные макроопределения.</p>
19 <p>Препроцессор - специальная программа, которая отвечает за предварительную обработку текста программы. С его помощью получается включать в исходный код файлы, а также вводить разнообразные макроопределения.</p>
20 <h2>Синтаксис директив</h2>
20 <h2>Синтаксис директив</h2>
21 <p>Директива - это командная строка препроцессора. Она в исходном коде имеет определенный формат:</p>
21 <p>Директива - это командная строка препроцессора. Она в исходном коде имеет определенный формат:</p>
22 <p># ключевое_слово заданные_параметры.</p>
22 <p># ключевое_слово заданные_параметры.</p>
23 <p>При помощи директив можно выполнять различные операции при "сборке" проекта для компиляции. Формируются они по следующим принципам:</p>
23 <p>При помощи директив можно выполнять различные операции при "сборке" проекта для компиляции. Формируются они по следующим принципам:</p>
24 <ul><li>символ решетки;</li>
24 <ul><li>символ решетки;</li>
25 <li>ноль или более символов пробелов/табуляции после;</li>
25 <li>ноль или более символов пробелов/табуляции после;</li>
26 <li>одно из предопределенных языком СИ ключевых слов;</li>
26 <li>одно из предопределенных языком СИ ключевых слов;</li>
27 <li>параметры, которые зависят непосредственно от ключевого слова.</li>
27 <li>параметры, которые зависят непосредственно от ключевого слова.</li>
28 </ul><p>Стоит обратить внимание на то, что, если ключевое слово не указано, the directive будет игнорироваться. При написании несуществующего "зарезервированного системой слова" на экране появится сообщение об ошибке. Компиляция будет прервана. В некоторых компиляторах компиляция продолжится, но с предварительным выводом предупреждения, сигнализирующего о сбое.</p>
28 </ul><p>Стоит обратить внимание на то, что, если ключевое слово не указано, the directive будет игнорироваться. При написании несуществующего "зарезервированного системой слова" на экране появится сообщение об ошибке. Компиляция будет прервана. В некоторых компиляторах компиляция продолжится, но с предварительным выводом предупреждения, сигнализирующего о сбое.</p>
29 <h2>Основные директивы</h2>
29 <h2>Основные директивы</h2>
30 <p>Существуют различные виды the directive в СИ семействе. Каждая из них отвечает за определенный спектр операций. Среди основных можно выделить такие варианты как:</p>
30 <p>Существуют различные виды the directive в СИ семействе. Каждая из них отвечает за определенный спектр операций. Среди основных можно выделить такие варианты как:</p>
31 <ul><li># define - с ее помощью можно задать макроопределение (макрос) или символическую константу;</li>
31 <ul><li># define - с ее помощью можно задать макроопределение (макрос) или символическую константу;</li>
32 <li>#undef - отмена предыдущего определения;</li>
32 <li>#undef - отмена предыдущего определения;</li>
33 <li>Include - вставка текста из указанного файла.</li>
33 <li>Include - вставка текста из указанного файла.</li>
34 </ul><p>Если заголовочный файл при использовании the #include включает в себя функции и инструменты библиотек и располагается в компиляторной папке, он должен быть заключен в угловые скобки. Если файл располагается в текущем каталоге проекта (или его путь указан в IDE), соответствующий компонент прописывается в кавычках-елочках. Для документа, который находится в другом каталоге, требуется в кавычках прописывать полный путь.</p>
34 </ul><p>Если заголовочный файл при использовании the #include включает в себя функции и инструменты библиотек и располагается в компиляторной папке, он должен быть заключен в угловые скобки. Если файл располагается в текущем каталоге проекта (или его путь указан в IDE), соответствующий компонент прописывается в кавычках-елочках. Для документа, который находится в другом каталоге, требуется в кавычках прописывать полный путь.</p>
35 <h3>Прочие виды</h3>
35 <h3>Прочие виды</h3>
36 <p>Указанные ранее элементы - это основные директивы препроцессора. Они не являются исключающими. В СИ семействе (в C++) можно встретить такие варианты как:</p>
36 <p>Указанные ранее элементы - это основные директивы препроцессора. Они не являются исключающими. В СИ семействе (в C++) можно встретить такие варианты как:</p>
37 <ul><li>if;</li>
37 <ul><li>if;</li>
38 <li>endif;</li>
38 <li>endif;</li>
39 <li>error;</li>
39 <li>error;</li>
40 <li>ifdef;</li>
40 <li>ifdef;</li>
41 <li>else;</li>
41 <li>else;</li>
42 <li>line;</li>
42 <li>line;</li>
43 <li>pragma;</li>
43 <li>pragma;</li>
44 <li>using;</li>
44 <li>using;</li>
45 <li>ifndef;</li>
45 <li>ifndef;</li>
46 <li>line;</li>
46 <li>line;</li>
47 <li>NULL.</li>
47 <li>NULL.</li>
48 </ul><p>Далее каждый компонент будет рассмотрен более подробно. Особое внимание будет уделено the if else endif и другим the directives условной компиляции.</p>
48 </ul><p>Далее каждый компонент будет рассмотрен более подробно. Особое внимание будет уделено the if else endif и другим the directives условной компиляции.</p>
49 <h4><em>Define</em></h4>
49 <h4><em>Define</em></h4>
50 <p>The definition (или the directive #define) определяет идентификатор и последовательность символов, которые будут заменять соответствующий идентификатор в приложении. Она позволяет вводить в текст проекта константы и макроопределения.</p>
50 <p>The definition (или the directive #define) определяет идентификатор и последовательность символов, которые будут заменять соответствующий идентификатор в приложении. Она позволяет вводить в текст проекта константы и макроопределения.</p>
51 <p>Форма записи:</p>
51 <p>Форма записи:</p>
52 <p>За счет этого компонента компилятор, вместо каждого аргумента Идентификатор в исходном файле подставляет выражение, скрытое под названием "Замена".</p>
52 <p>За счет этого компонента компилятор, вместо каждого аргумента Идентификатор в исходном файле подставляет выражение, скрытое под названием "Замена".</p>
53 <h4><em>Error</em></h4>
53 <h4><em>Error</em></h4>
54 <p>Изучая the if def и другие директивы условной компиляции, нельзя забывать о других подобных элементах. Пример - #error. При помощи соответствующей записи компилятор сможет приостановить компиляцию. Используется для непосредственной отладки проекта. Синтаксическая форма:</p>
54 <p>Изучая the if def и другие директивы условной компиляции, нельзя забывать о других подобных элементах. Пример - #error. При помощи соответствующей записи компилятор сможет приостановить компиляцию. Используется для непосредственной отладки проекта. Синтаксическая форма:</p>
55 <p>Error_message - это сообщение об ошибке. Текст, который должен выводиться в консоль при формировании объектного кода.</p>
55 <p>Error_message - это сообщение об ошибке. Текст, который должен выводиться в консоль при формировании объектного кода.</p>
56 <h4><em>Undef</em></h4>
56 <h4><em>Undef</em></h4>
57 <p>Используется для того, чтобы удалить макрос, который ранее был определен через #define. После его применения имя удаляемого макроса становится неопределенным. Запись:</p>
57 <p>Используется для того, чтобы удалить макрос, который ранее был определен через #define. После его применения имя удаляемого макроса становится неопределенным. Запись:</p>
58 <p>Здесь macros_name - это имя макроса, от которого необходимо избавиться.</p>
58 <p>Здесь macros_name - это имя макроса, от которого необходимо избавиться.</p>
59 <h4><em>Import</em></h4>
59 <h4><em>Import</em></h4>
60 <p>Компонент #import позволяет включать сведения из библиотеки типов (TBL - type library). В этом случае под библиотекой понимается иерархическое хранилище данных о возможностях Active-X сервера. Она сохраняется как файл с расширениями .tlb или .olb.</p>
60 <p>Компонент #import позволяет включать сведения из библиотеки типов (TBL - type library). В этом случае под библиотекой понимается иерархическое хранилище данных о возможностях Active-X сервера. Она сохраняется как файл с расширениями .tlb или .olb.</p>
61 <p>Синтаксическая запись #import:</p>
61 <p>Синтаксическая запись #import:</p>
62 <p>Тут:</p>
62 <p>Тут:</p>
63 <ol><li>Filename - имя файла, которое содержит библиотеку типов. В качестве соответствующего компонента могут выступать документы с расширениями .tlb, .olb, .dll или .exe. Другие форматы, распознаваемые функцией API LoadTypeLib тоже допускаются.</li>
63 <ol><li>Filename - имя файла, которое содержит библиотеку типов. В качестве соответствующего компонента могут выступать документы с расширениями .tlb, .olb, .dll или .exe. Другие форматы, распознаваемые функцией API LoadTypeLib тоже допускаются.</li>
64 <li>Attributes - директивные атрибуты. Они указывают на то, что компилятор будет менять содержимое заголовка библиотеки типов.</li>
64 <li>Attributes - директивные атрибуты. Они указывают на то, что компилятор будет менять содержимое заголовка библиотеки типов.</li>
65 </ol><p>Больше подробностей об атрибутах #import рекомендуется изучить в официальной документации C++ на сайте Microsoft. Новичкам углубляться в соответствующую сферу нет необходимости.</p>
65 </ol><p>Больше подробностей об атрибутах #import рекомендуется изучить в официальной документации C++ на сайте Microsoft. Новичкам углубляться в соответствующую сферу нет необходимости.</p>
66 <h4><em>Using</em></h4>
66 <h4><em>Using</em></h4>
67 <p>The #using - это не the of else end if, но тоже достаточно важный компонент для компиляции. С его помощью получится импортировать метаданные в приложение, которые были скомпилированы с параметром /clr. Это значит, что использование директивы допускается только в режиме C++/CLI. Записывается так:</p>
67 <p>The #using - это не the of else end if, но тоже достаточно важный компонент для компиляции. С его помощью получится импортировать метаданные в приложение, которые были скомпилированы с параметром /clr. Это значит, что использование директивы допускается только в режиме C++/CLI. Записывается так:</p>
68 <p>Тут filename - это имя файла с расширением .dll, .exe, .net module или .obj. Позволяет подключать различные библиотеки и использовать именные пространства.</p>
68 <p>Тут filename - это имя файла с расширением .dll, .exe, .net module или .obj. Позволяет подключать различные библиотеки и использовать именные пространства.</p>
69 <h4><em>Pragma</em></h4>
69 <h4><em>Pragma</em></h4>
70 <p>Используется для задания компилятору функций выполнения. Использование команд зависит от операционной системы и устройства, который называется хостом. Характеристики функций компилятора будут определяться при установке компилятора C/C++ на компьютер.</p>
70 <p>Используется для задания компилятору функций выполнения. Использование команд зависит от операционной системы и устройства, который называется хостом. Характеристики функций компилятора будут определяться при установке компилятора C/C++ на компьютер.</p>
71 <p>Через #pragma можно предложить компилятору различные команды для их обработки с обеспечением полноценной совместимости с Си-семейством. Обладает соответствующий компонент разнообразными нюансами применения и несколькими реализациями. Общая синтаксическая форма представления:</p>
71 <p>Через #pragma можно предложить компилятору различные команды для их обработки с обеспечением полноценной совместимости с Си-семейством. Обладает соответствующий компонент разнообразными нюансами применения и несколькими реализациями. Общая синтаксическая форма представления:</p>
72 <p>Здесь token_string - строка токена, которая может иметь различные значения. Она представляет собой символьный набор, определяющий спектр инструкций и их аргументов. Для новичков #pragma не является одним из важнейших компонентов.</p>
72 <p>Здесь token_string - строка токена, которая может иметь различные значения. Она представляет собой символьный набор, определяющий спектр инструкций и их аргументов. Для новичков #pragma не является одним из важнейших компонентов.</p>
73 <h3>Условная компиляция</h3>
73 <h3>Условная компиляция</h3>
74 <p>Для условной компиляции используются the if else endif и другие the directives. Они помогают управлять упомянутым процессом. Каждое "выражение" имеет собственное предназначение.</p>
74 <p>Для условной компиляции используются the if else endif и другие the directives. Они помогают управлять упомянутым процессом. Каждое "выражение" имеет собственное предназначение.</p>
75 <p>If, else, endif и elif используются для того, чтобы задать части программы, которые нужно откомпилировать в зависимости от значения константного выражения.</p>
75 <p>If, else, endif и elif используются для того, чтобы задать части программы, которые нужно откомпилировать в зависимости от значения константного выражения.</p>
76 <p>The if проверяет, является ли препроцессорное выражение истинным или нет. Имеет следующую форму записи:</p>
76 <p>The if проверяет, является ли препроцессорное выражение истинным или нет. Имеет следующую форму записи:</p>
77 <p>Здесь:</p>
77 <p>Здесь:</p>
78 <ol><li>Constant_expression (definitions) - это константное выражение. Оно может принимать только два варианта значений - true и false.</li>
78 <ol><li>Constant_expression (definitions) - это константное выражение. Оно может принимать только два варианта значений - true и false.</li>
79 <li>Operator_sequence - последовательность операторов, которая выполняется при if defined (expression) = true.</li>
79 <li>Operator_sequence - последовательность операторов, которая выполняется при if defined (expression) = true.</li>
80 </ol><p>А вот наглядный пример использования связки if endif:</p>
80 </ol><p>А вот наглядный пример использования связки if endif:</p>
81 <p>При обработке соответствующего фрагмента кода в консоли появится такой результат:</p>
81 <p>При обработке соответствующего фрагмента кода в консоли появится такой результат:</p>
82 <p>Это первый пример работы с if the defined. Есть и другие комбинации. Они будут рассмотрены далее.</p>
82 <p>Это первый пример работы с if the defined. Есть и другие комбинации. Они будут рассмотрены далее.</p>
83 <h4><em>If else</em></h4>
83 <h4><em>If else</em></h4>
84 <p>Следующая комбинация, которая используется в C - if elif else. Она помогает откомпилировать одну из двух частей приложений в зависимости от значения условного выражения. Общая синтаксическая форма записи:</p>
84 <p>Следующая комбинация, которая используется в C - if elif else. Она помогает откомпилировать одну из двух частей приложений в зависимости от значения условного выражения. Общая синтаксическая форма записи:</p>
85 <p>Тут:</p>
85 <p>Тут:</p>
86 <ol><li>Constant_expression - выражение, которое возвращает значение логического типа. Оно может быть true или false.</li>
86 <ol><li>Constant_expression - выражение, которое возвращает значение логического типа. Оно может быть true или false.</li>
87 <li>Operators_sequence_1 - операторы, которые выполняются при значении выражения true.</li>
87 <li>Operators_sequence_1 - операторы, которые выполняются при значении выражения true.</li>
88 <li>Operators_sequence_2 - последовательность функций, реализующихся, если в блоке if the defined выражение будет false.</li>
88 <li>Operators_sequence_2 - последовательность функций, реализующихся, если в блоке if the defined выражение будет false.</li>
89 </ol><p>Ниже наглядный пример работы с соответствующей последовательностью. Тут, в зависимости от значения N_SOLUTION, будет формироваться тот или иной фрагмент кода. Он определит длину окружности или площадь заданного круга:</p>
89 </ol><p>Ниже наглядный пример работы с соответствующей последовательностью. Тут, в зависимости от значения N_SOLUTION, будет формироваться тот или иной фрагмент кода. Он определит длину окружности или площадь заданного круга:</p>
90 <p>Выше можно увидеть не только фрагмент кода, но и результат его непосредственной обработки.</p>
90 <p>Выше можно увидеть не только фрагмент кода, но и результат его непосредственной обработки.</p>
91 <h4><em>If-else-if</em></h4>
91 <h4><em>If-else-if</em></h4>
92 <p>При изучении the ifdef else в C и других директив условной компиляции, стоит обратить внимание на цепочку if-else-if. Она называется ступенчатой (или каскадной). Директива the elif - это else-if. С ее помощью удается проверять разнообразные условия.</p>
92 <p>При изучении the ifdef else в C и других директив условной компиляции, стоит обратить внимание на цепочку if-else-if. Она называется ступенчатой (или каскадной). Директива the elif - это else-if. С ее помощью удается проверять разнообразные условия.</p>
93 <p>Синтаксическая общая форма соответствующей записи:</p>
93 <p>Синтаксическая общая форма соответствующей записи:</p>
94 <p>В заданном фрагменте if the define:</p>
94 <p>В заданном фрагменте if the define:</p>
95 <ul><li>expression_1, expression_2, expression_N - некоторые выражения, которые могут быть истиной и ложью;</li>
95 <ul><li>expression_1, expression_2, expression_N - некоторые выражения, которые могут быть истиной и ложью;</li>
96 <li>operators_sequence_1, operators_sequence_2, operators_sequence_N - операторы, которые будут компилироваться в заданном кодовом фрагменте.</li>
96 <li>operators_sequence_1, operators_sequence_2, operators_sequence_N - операторы, которые будут компилироваться в заданном кодовом фрагменте.</li>
97 </ul><p>Рассмотрим наглядный пример работы с соответствующей комбинацией. В зависимости от значения N_SOLUTION будет происходить вычисление той или иной формулы:</p>
97 </ul><p>Рассмотрим наглядный пример работы с соответствующей комбинацией. В зависимости от значения N_SOLUTION будет происходить вычисление той или иной формулы:</p>
98 <p>Выше результат обработки the if c endif с использованием elif. </p>
98 <p>Выше результат обработки the if c endif с использованием elif. </p>
99 <h4><em>Ifdef</em></h4>
99 <h4><em>Ifdef</em></h4>
100 <p>The ifdef и ifndef отвечают за обеспечение еще одного вида условной компиляции. Дословно соответствующие комбинации определяются как "если определено" (if the defined) и "если не определено".</p>
100 <p>The ifdef и ifndef отвечают за обеспечение еще одного вида условной компиляции. Дословно соответствующие комбинации определяются как "если определено" (if the defined) и "если не определено".</p>
101 <p>Синтаксическая форма соответствующего выражения:</p>
101 <p>Синтаксическая форма соответствующего выражения:</p>
102 <p>Тут:</p>
102 <p>Тут:</p>
103 <ul><li>macros_name - название макроса, которое будет проведено на факт определение define;</li>
103 <ul><li>macros_name - название макроса, которое будет проведено на факт определение define;</li>
104 <li>operators_sequence - последовательность, заданная для реализации в коде.</li>
104 <li>operators_sequence - последовательность, заданная для реализации в коде.</li>
105 </ul><p>Ifndef выглядит так:</p>
105 </ul><p>Ifndef выглядит так:</p>
106 <p>Здесь, если имя макроса определено, заданная последовательность operator_sequence не будет выполняться.</p>
106 <p>Здесь, если имя макроса определено, заданная последовательность operator_sequence не будет выполняться.</p>
107 <p>P. S. Интересует разработка? Обратите внимание на <a>курс "Программист C"</a>. Также<em>в <a>Otus</a></em>доступно множество других современных курсов. Ниже - один из них:</p>
107 <p>P. S. Интересует разработка? Обратите внимание на <a>курс "Программист C"</a>. Также<em>в <a>Otus</a></em>доступно множество других современных курсов. Ниже - один из них:</p>
108 <a></a>
108 <a></a>