Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизДирективы компиллятора {$IF произвольная_константа = ..} Найти похожие ветки
← →
Курдль © (2004-04-15 11:54) [0]Не могу добиться работы этой директивы :(
Пример кода, который не компилится при любом значении константы:
const FULL_VERSION = True;
{$IF FULL_VERSION}
procedure DoFullVersionFunctional;
begin
...
end;
{$IFEND}
Т.е. Делфя все съедает без замечаний, прекрасно игнорирует процедуру, но включать ее обратно не хочет ни в какую!
Чё посоветуете?
← →
Smithson © (2004-04-15 11:55) [1]Там, по-моему, должны быть специально задаваемые директивы компилятора. А не константы.
← →
Reindeer Moss Eater © (2004-04-15 11:55) [2]{$IFDEF FULL_VERSION}
{$ENDIF}
← →
Reindeer Moss Eater © (2004-04-15 11:56) [3]Чё посоветуете?
Учебники посоветуем
← →
clickmaker © (2004-04-15 11:56) [4]{$DEFINE FULL_VERSION}
{$IFDEF FULL_VERSION}
procedure DoFullVersionFunctional;
begin
...
end;
{$ENDIF}
← →
Тимохов © (2004-04-15 11:58) [5]Да в общем то автор вроде как правильно все делает
надо
{$IF FULL_VERSION = false}
procedure DoFullVersionFunctional;
begin
...
end;
{$IFEND}
← →
Digitman © (2004-04-15 12:00) [6]
> Курдль © (15.04.04 11:54)
в опциях проекта есть список Conditional Defines
вот если в этом списке будет фигурировать строка FULL_VERSION, то компилятор отработает то что ты заключил в скобки условной компиляции
{$IFDEF FULL_VERSION} //если имя FULL_VERSION фигурирует в указанной опции, то ..
.. все что здесь есть, компилятор отработает
{$ENDIF}
← →
Reindeer Moss Eater © (2004-04-15 12:02) [7]Да в общем то автор вроде как правильно все делает
надо
{$IF FULL_VERSION = false}
А если у меня в тысяче мест проекта условная компиляция?
Мне во всех этих местах менять false на true?
И это у нас "правильно" зовется?
← →
Курдль © (2004-04-15 12:03) [8]
> Reindeer Moss Eater © (15.04.04 11:56) [3]
> Чё посоветуете?
>
> Учебники посоветуем
Пример из "Delphi6 для профессионалов" Марко Кэнту 2002
[5]
Естественно я всякие варианты попробовал, прежде, чем потревожить многоуважаемых маэстро :)
← →
Тимохов © (2004-04-15 12:05) [9]
> Курдль © (15.04.04 12:03) [8]
Уважаемый, вы гоните.
Я тоже попробовал - прекрасно работатет.
← →
Reindeer Moss Eater © (2004-04-15 12:06) [10]Пример из "Delphi6 для профессионалов" Марко Кэнту 2002
Под учебниками имелись ввиду первоисточники. То есть встроенная документация от производителя.
← →
Тимохов © (2004-04-15 12:06) [11]
> Reindeer Moss Eater © (15.04.04 12:02) [7]
Правильно? В соответствии с официальной документацией фирмы Borland к языку программирования Delphi 6.
← →
Тимохов © (2004-04-15 12:07) [12]
> Reindeer Moss Eater © (15.04.04 12:06) [10]
Не упорствуйте, в официально доке это есть.
← →
Reindeer Moss Eater © (2004-04-15 12:09) [13]Я не про то, что этого там нет.
Я про стиль и удобство сопровождения.
Если в тысяче мест кода надо править конструкцию {$IF FULL_VERSION = false}
то это почти ничем не отличается от закоментаривания/раскоментаривания кусков кода.
← →
Курдль © (2004-04-15 12:10) [14]
> Digitman © (15.04.04 12:00) [6]
> в опциях проекта есть список Conditional Defines
Об этой фитче я знаю :) Но в книжке [8] анонсировано, как "новая директива" управления компиляцией с помощью произвольных констант из контекста модуля и пример приведен. Вот он полный дословно:
const DebugControl = 2;
{$IF Defined(DEBUG) and (DebugControl > 3)}
ShowMessage("Исполняем критический код");
{$IFEND}
← →
Тимохов © (2004-04-15 12:12) [15]
> Reindeer Moss Eater © (15.04.04 12:09) [13]
Не увиливайте - вы имели в виду, что в доке этого нет, и соответвенно немного были не вежливы к автору, посылая его к учебникам.
Про удобство.
Этот механизм позволяет делать более навернутые условия проверки.
Посмотрите в исходниках VCL там это тоже где-то используется (см. например system или sysutils)
← →
Тимохов © (2004-04-15 12:13) [16]
> Курдль © (15.04.04 12:10) [14]
Так что у вас не получилось? Быть не может, проверил же ...
← →
Курдль © (2004-04-15 12:15) [17]При переключении const FULL_VERSION = True;
на False ничего не меняется - исключенные из компилляции фрагменты кода опять игнорируются.
← →
Reindeer Moss Eater © (2004-04-15 12:16) [18]Тимохов ©
И где это я был невежлив к автору вопроса?
В [3] что ли?
← →
Reindeer Moss Eater © (2004-04-15 12:18) [19]Тимохов ©
Этот механизм позволяет делать более навернутые условия проверки.
Я конкретно был против конкретного вашего поста. Вот он.
надо
{$IF FULL_VERSION = false}
А не против более навернутых условий проверки
← →
Тимохов © (2004-04-15 12:19) [20]У меня это прекрасно работает.
const aaa = true;
{$if not aaa}
без ошибки
{$ifend}
{$if aaa}
ошибка
{$ifend}
← →
Тимохов © (2004-04-15 12:20) [21]
> Reindeer Moss Eater © (15.04.04 12:18) [19]
Чем вам пост не нравится.
См. 20 - все работате из без "= false". Я это просто не проверил, т.к. автор сказал, что это не работает. Т.е. можно и без = true.
В общем то на вопрос автора мы так и не ответили - у него не работает конструкция, которая у меня работате. Что-то тут не так...
← →
Reindeer Moss Eater © (2004-04-15 12:22) [22]Мне все нравится.
Мне не нравится
надо
{$IF FULL_VERSION = false}
← →
Тимохов © (2004-04-15 12:25) [23]
> Reindeer Moss Eater © (15.04.04 12:22) [22]
> Мне все нравится.
> Мне не нравится
В чем фишка поста то?
Если вы обиделись на замечание, прошу прощения. Но согласитесь, что данная фича описана в официальной доке :)))
← →
Reindeer Moss Eater © (2004-04-15 12:26) [24]Для одаренных повторяю, что я нигде и не говорил что её нет.
← →
Тимохов © (2004-04-15 12:31) [25]
> Reindeer Moss Eater © (15.04.04 12:26) [24]
для особо одаренных повторяю, что я нигде не говорил, что вы говорили, что ее нет, я говорил, что вы говорили, что ее нет в официальной доке.
предлагаю закончить на этом.
← →
Курдль © (2004-04-15 12:31) [26]
> {$IF FULL_VERSION = false}
Так я тоже попробовал.
Единственный тестовый вариант, с которым "критические фрагменты" были включены в модуль:
{$IF not Defined(FULL_VERSION)}
"критический фрагмент"
{$IFEND}
Для чтстоты эксперимента, где у Вас определена константа?
← →
Тимохов © (2004-04-15 12:33) [27]
> Курдль © (15.04.04 12:31) [26]
Вы кого спрашивайте? Меня? О Фрагменте
const aaa = true;
{$if not aaa}
без ошибки
{$ifend}
{$if aaa}
ошибка
{$ifend}
Отвечаю - все описано ровно так, никаких строк не выкинуто.
← →
Курдль © (2004-04-15 12:41) [28]Совсем тестовая прога отработала, как надо, так что буду разбираться со своим модулем...
unit Unit1;
interface
uses
SysUtils, Types, Classes, QGraphics, QControls, QForms, QDialogs,
QStdCtrls;
const FULL_VERSION = False;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.xfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
{$IF FULL_VERSION}
Color := clRed;
{$IFEND}
end;
end.
← →
Reindeer Moss Eater © (2004-04-15 12:41) [29]Тимохов ©
Но согласитесь, что данная фича описана в официальной доке :)))
Зачем мне предлагалось согласиться с тем, с чем я не был несогласен?
Это для очень особо одаренных, не понимающих о чем я.
← →
Тимохов © (2004-04-15 13:18) [30]
> Reindeer Moss Eater © (15.04.04 12:41) [29]
Да, похоже на то, что вы правы. Если обидел, прощения я где-то выше просил.
Вы не юрист по образованию?
← →
Курдль © (2004-04-15 13:23) [31]Причина найдена - нелепая опечатка при определении константы.
Будьте осторожны - директивы компилятора не выдают никаких предупреждений об отсутствии констант, которые вы им прописываете!
← →
Тимохов © (2004-04-15 13:32) [32]
> Курдль © (15.04.04 13:23) [31]
Вполне логично, что не проверяет.
имхо.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.037 c