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>