Skip to main content

Что такое условная компиляция?

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

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

Директивы, которые используются для проверки определенных условных переменных, являются зачаточными и следуют той же логике, что и оператор if-then. Основные тесты, которые можно выполнить для условной компиляции, - это то, определено ли значение, а не определено, или, в некоторых случаях, эквивалентны ли две определенные переменные. Сами переменные или макросы, как правило, не имеют никакого значения значимости, потому что директивы определяют их действие. Однако в некоторых языках и компиляторах значение определенной переменной может иметь значение, если они вычисляются для логического состояния.

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

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