Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.53 MB
Время: 0.036 c
14-1081418280
Она
2004-04-08 13:58
2004.05.02
сабж


1-1081845095
Islander
2004-04-13 12:31
2004.05.02
Как загрузить иконку с определенным индексом из ico-файла


4-1078821589
PVR
2004-03-09 11:39
2004.05.02
Остановить и стартануть сервис


14-1081759781
Lexer
2004-04-12 12:49
2004.05.02
Характеристика программиста


3-1081318972
besen-ok
2004-04-07 10:22
2004.05.02
Как орпеделить является значение Null





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский