Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
37 / 31 / 13
Регистрация: 08.12.2012
Сообщений: 812

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

29.12.2014, 19:27. Показов 3479. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
хотелось бы разобраться в вопросе
"Что такое условная компиляция,как помогает созданию программы,нужна ли
только в процессе отладки ,чем удобно отличается от обычных if else end"
к сожалению даже более менее простой и разумный код не могу
привести чтобы задать адекватный вопрос кроме общего вопроса
(см.выше)
просмотрел инет , подробного объяснения не нашел (в смысле хотя бы "разжевать")
везде одно - условная компиляция,условные идентификаторы
почему условные идентификаторы? потому что не описываются нигде?

вот например простая прога можно ли сюда включить условную компиляцию
чтобы изменить ее работу или может какой другой простой пример предложите...
Pascal
1
2
3
4
5
6
7
8
   var i,x: integer;
  begin
    i:= 4;
    if i >= 4 then
     x:= 4 
       else
     x:= 0;
  end.
думаю что пишу тут глупые вопросы
но с чего то хотя бы начать
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.12.2014, 19:27
Ответы с готовыми решениями:

условная компиляция
Procedure SetPort(p:word;b:byte);stdcall; {$ifdef RWPort} var len: cardinal; written: cardinal; {$endif} begin {$ifdef...

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

Условная компиляция
как препроцессор с помощью условной компиляции даёт понять компилятору, что часть программы необходимо скомпилировать или пропустить?

4
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33377 / 21501 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
30.12.2014, 12:03
Лучший ответ Сообщение было отмечено ujif как решение

Решение

Цитата Сообщение от ujif Посмотреть сообщение
Что такое условная компиляция
Компиляция разных кусков кода в зависимости от некоторых условий. То есть,
Pascal
1
2
3
4
5
6
7
uses
{$ifdef FPC}
  WinCRT,
{$else}
  CRT,
{$endif}
// ...
Условие: Если используется компилятор FPC (в котором определен условный символ FPC), то компилируется 3-я строка. Если же этот условный символ не определен, то компилируется строка №5. Вот поэтому компиляция и называется условной.
чем удобно отличается от обычных if else end
При обычной компиляции, и использовании выражения
Pascal
1
if условие then операторы_да else операторы_нет
в код включается как операторы_да, так и операторы_нет, то есть, коды обеих веток (ну, за редкими исключениями, когда оптимизатор выбрасывает одну из веток, если условие всегда истинно, или всегда ложно, и это известно еще на этапе компиляции). В случае же использования директив условной компиляции, в процессе компиляции
Pascal
1
{$ifdef условие} код_1 {$else} код_2 {$endif}
участвует только одна из веток, о второй компилятор вообще ничего не знает.

Очень удобно использовать условную компиляцию, скажем, при необходимости протестировать программу без каких-то функций. Скажем, пишешь ты программу, с музыкальным сопровождением. Если обернуть везде работу с музыкой в директивы условной компиляции:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{$define PlayMusic}
 
// ...
 
{$ifdef PlayMusic}
  тут, например, поиск файла, и его открытие
{$endif}
 
// ...
 
{$ifdef PlayMusic}
  тут начинаешь играть музыку
{$endif}
 
// ...
 
{$ifdef PlayMusic}
  тут пауза
{$endif}
 
// ...
 
{$ifdef PlayMusic}
  тут, продолжение (снятие с паузы)
{$endif}
 
// ...
 
{$ifdef PlayMusic}
  тут, остановка и освобождение ресурсов
{$endif}
, то просто закомментировав одну строку кода (самую первую) и перекомпилировав программу, ты выбросишь из EXE все упоминания о музыке. Вместо того, чтобы ползать по всей программе, и искать, где там у тебя нужные участки, и комментировать/раскомментировать их...

Для написания приложений под разные ОСи тоже очень удобно. Скажем, 32-битный код и 64-битный могут быть разными... Но учти, директивы условной компиляции имеют смысл только при компиляции из исходника. Нельзя написать
Pascal
1
2
3
4
5
6
7
8
// ...
  {$ifdef i386}   
    // тут 32-битный код
  {$endif}  
  {$ifdef cpux86_64} 
    // тут - 64-битный
  {$endif}
// ...
, откомпилировать программу, например, 32-битным компилятором, и надеяться, что при запуске будет определена битность ОС и отработает нужный кусок кода. Не отработает. Работать будет тот кусок, который был предоставлен компилятору в момент сборки проекта.
4
37 / 31 / 13
Регистрация: 08.12.2012
Сообщений: 812
30.12.2014, 12:44  [ТС]
Спасибо Уважаемый volvo за поддержку ,очень подробно ,понятно
и исчерпывающе
0
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
30.12.2014, 13:03
Лучший ответ Сообщение было отмечено ujif как решение

Решение

volvo, оказывается, уже ответил. Всё же свой пост тоже оставлю.

С помощью условной компиляции можно включать или исключать из компиляции определённые участки кода. Например, работа с файлами отличается в разных операционных системах (ОС): Windows/DOS, Linux, MacOS и т. д.. И в программе можно написать несколько участков кода для работы с файлами в этих ОС. С помощью условной компиляции выполняется подключение только подходящего участка кода. Остальные участки, предназначенные для других ОС, через условную компиляцию отключаются. Это можно сделать, например, в Lazarus. В Delphi XE4 есть возможность компиляции под ОС: Windows, MacOS, iOS, Android.
Пример условной компиляции в Delphi - объявление констант, предназначенных для работы с файлами:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const
 
{ File open modes }
 
{$IFDEF LINUX}
  fmOpenRead       = O_RDONLY;
  fmOpenWrite      = O_WRONLY;
  fmOpenReadWrite  = O_RDWR;
//  fmShareCompat not supported
  fmShareExclusive = $0010;
  fmShareDenyWrite = $0020;
//  fmShareDenyRead  not supported
  fmShareDenyNone  = $0030;
{$ENDIF}
{$IFDEF MSWINDOWS}
  fmOpenRead       = $0000;
  fmOpenWrite      = $0001;
  fmOpenReadWrite  = $0002;
 
  fmShareCompat    = $0000 platform; // DOS compatibility mode is not portable
  fmShareExclusive = $0010;
  fmShareDenyWrite = $0020;
  fmShareDenyRead  = $0030 platform; // write-only not supported on all platforms
  fmShareDenyNone  = $0040;
{$ENDIF}
Далее код заключен в теги DELPHI, а не PASCAL потому, что в этом случае удобнее реализована подсветка директив.

Условную компиляцию можно выполнять в зависимости от настроек компилятора. Пример:
Delphi
1
2
3
4
5
6
7
8
9
{Если включен режим использования математического сопроцессора, то переопределяем
тип Real на более мощный - Extended.}
{$IFOPT N+}
  type
    Real = Extended;
{$ENDIF}
 
var
  a, b : Real;
Кроме этого, условная компиляция удобна для отладки программ. Пример:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
program Project1;
 
{Определяем "символ" условной итерации - "DEBUG". Можно и другие названия придумать - "TEST", например.}
{$DEFINE DEBUG}
 
var
  Sum : Extended;
begin
  Sum := 0;
  {$IFDEF DEBUG} {Если "символ" DEBUG определён, то компилируется участок кода, следующий до ENDIF.}
  Writeln('Отладка. Переменная Sum обнулена.');
  {$ENDIF}
  for i := 1 to 10 do
  begin
    Sum := Sum + i;
    {$IFDEF DEBUG}
    Writeln('Отладка. Шаг i = ', i, ', промежуточная сумма = ', Sum);
    {$ENDIF}
  end;
  Writeln('Sum = ', Sum);
  Readln;
end.
Можно, также, использовать форму с ELSE:
Delphi
1
2
3
4
5
  {$IFDEF DEBUG} {Код, который включается в компиляцию, если определён символ DEBUG.}
  ...
  {$ELSE} {Код, который включается в компиляцию, если символ DEBUG НЕ определён.}
  ...
  {$ENDIF}
Есть ещё директива {$IFNDEF}. Она имеет смысл: "если символ НЕ определён". Эта директива работает наоборот относительно {$IFDEF}. Пример:
Delphi
1
2
3
4
5
  {$IFNDEF DEBUG} {Код, который включается в компиляцию, если символ DEBUG НЕ определён.}
  ...
  {$ELSE} {Код, который включается в компиляцию, если определён символ DEBUG.}
  ...
  {$ENDIF}
Чтобы отключить определение символа условной компиляции, достаточно сразу после фигурной скобки добавить какой-нибудь дополнительный знак, например: "-":
Delphi
1
2
3
{Добавив знак "-" определение перестаёт действовать, т. к. компилятор такую конструкцию
воспринимает, как обыкновенный комментарий.}
{-$DEFINE DEBUG}
Кроме этого можно отменить определение символа средствами условной компиляции:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  {$DEFINE DEBUG} {Определяем символ.}
 
  {$IFDEF DEBUG} {Код, который компилируется, только если символ DEBUG определён.}
  ...
  {$ELSE} {Код, который компилируется, только если символ DEBUG НЕ определён.}
  ...
  {$ENDIF}
 
  {$UNDEF DEBUG} {Отменяем определение символа DEBUG.}
 
  {$IFDEF DEBUG} {Теперь код в этом разделе не будет включен в компиляцию. Т. к., символ DEBUG теперь не определён.}
  ...
  {$ELSE} {Код из этого раздела будет включен в компиляцию потому, что символ DEBUG не определён.}
  ...
  {$ENDIF}
Отмена определения через {$UNDEF DEBUG} удобна в том случае, когда часть кода уже отлажена и в этой части уже можно отказаться от кода отладки.
3
37 / 31 / 13
Регистрация: 08.12.2012
Сообщений: 812
30.12.2014, 15:42  [ТС]
и Вам спасибо Уважаемый Mawrat за поддержку,
с Вашей помощью еще более прояснилось в моей
голове, буду теперь уверенно условно компилировать
Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.12.2014, 15:42
Помогаю со студенческими работами здесь

Условная компиляция
Простенькая программка, которая при изменении в коде S с 1 на 2 должна выводить разные значения. Проблема в том что не срабатывает #if. При...

Условная компиляция
Помогите мне понять ,что я делаю не так. Есть программа, которая проверяет введённое пользователем число и в зависимости от значения...

Условная компиляция
Здравстуйте Если задача в зависимости от разрядности компилируемого приложения, подключить разные варианты кода Подскажите, как это...

Условная компиляция
Здравствуйте! Прошу помогите, пожалуйста! Я создала программу, которая сначала создает массив из 10 случайных чисел, а потом находит...

Условная компиляция
Не совсем понимаю как это работает. Есть код, написанный под sdk-19. Необходимо создать класс, который работал бы под sdk-21. При...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru