Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

Директивы компиллятора {$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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.024 c
1-1081944980
AMogil
2004-04-14 16:16
2004.05.02
Предварительная обработка строк перед передачей в Format


6-1078837747
vintik
2004-03-09 16:09
2004.05.02
как получить имя текущего usera


14-1081318237
Style
2004-04-07 10:10
2004.05.02
Мастера, помогите решить такую проблемму.


14-1081250112
Фикус
2004-04-06 15:15
2004.05.02
Подскажите, как решить.


1-1081966538
Netrix
2004-04-14 22:15
2004.05.02
Как зная путь и имя файла определить каким процессом он открыт?