Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Директивы и их описание 
:(
    Опции темы
RA
  Дата 22.1.2004, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Ктонить может выложить список всех директив и описание к ним?
PM   Вверх
DriveSoftware
Дата 22.1.2004, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 17.3.2003

Репутация: нет
Всего: 4



директивы условной компиляции
{$C+} и {$C-} - директивы проверки утверждений
{$I+} и {$I-} - директивы контроля ввода/вывода
{$M} и {$S} - директивы, определяющие размер стека

{$M+} и {$M-} - директивы информации времени выполнения о типах
{$Q+} и {$Q-} - директивы проверки переполнения целочисленных операций

{$R} - директива связывания ресурсов

{$R+} и {$R-} - директивы проверки диапазона

{$APPTYPE CONSOLE} - директива создания консольного приложения



1) Директивы компилятора, разрешающие или запрещающие проверку утверждений.

По умолчанию {$C+} или {$ASSERTIONS ON}

Область действия локальная


Описание

Директивы компилятора $C разрешают или запрещают проверку утверждений. Они влияют на работу процедуры Assert,используемой при отладке программ. По умолчанию действует
директива {$C+} и процедура Assert генерирует исключение EAssertionFailed, если проверяемое утверждение ложно.

Так как эти проверки используются только в процессе отладки программы, то перед ее окончательной компиляцией следует указать директиву {$C-}. При этом работа процедур Assert будет блокировано и генерация исключений EassertionFailed производиться не будет.

Директивы действуют на весь файл исходного кода независимо от того, в каком месте файла они расположены.





2) Директивы компилятора, включающие и выключающие контроль файлового ввода-вывода.

По умолчанию {$I+} или {$IOCHECKS ON}

Область действия локальная

Описание

Директивы компилятора $I включают или выключают автоматический контроль результата вызова процедур ввода-вывода Object Pascal. Если действует директива {$I+}, то при возвращении процедурой ввода-вывода ненулевого значения генерируется
исключение EInOutError и в его свойство errorcode заносится код ошибки. Таким образом, при действующей директиве {$I+} операции ввода-вывода располагаются в блоке try...except, имеющем обработчик исключения EInOutError. Если такого блока нет, то обработка производится методом TApplication.HandleException.

Если действует директива {$I-}, то исключение не генерируется. В этом случае проверить, была ли ошибка, или ее не было, можно, обратившись к функции IOResult. Эта функция очищает ошибку и возвращает ее код, который затем можно анализировать. Типичное применение директивы {$I-} и функции IOResult демонстрирует следующий пример:

{$I-}

AssignFile(F,s);
Rewrite(F);

{$I+}
i:=IOResult;
if i<>0 then

case i of
2: ..........
3: ..........
end;

В этом примере на время открытия файла отключается проверка ошибок ввода вывода, затем она опять включается, переменной i присваивается значение, возвращаемое функцией IOResult и, если это значение не равно нулю (есть ошибка), то предпринимаются какие-то действия в зависимости от кода ошибки. Подобный стиль программирования был типичен до введения в Object Pascal механизма обработки исключений. Однако сейчас, по-видимому, подобный стиль устарел и применение директив $I потеряло былое значение.


3) Директивы компилятора, определяющие размер стека

По умолчанию {$M 16384,1048576}


Область действия глобальная

Описание

Локальные переменные в процедурах и функциях размещаются в стеке приложения. При каждом вызове процедуры или функции ее локальные переменные помещаются в стек. При выходе из процедуры или функции эти локальные процедуры удаляются из стека.
Директивы компилятора $M задают параметры стека приложения: его минимальный и максимальный размеры. Приложение всегда гарантировано имеет размер стека, равный его минимальной величине. Если при запуске приложения Windows обнаруживает, что не может
выделить этот минимальный объем памяти, то выдается сообщение об этой ошибке.

Если во время работы выясняется, что минимального размера стека не хватает, то размер увеличивается на 4 K, но не более, чем до установленного директивой максимального размера. Если увеличение размера стека невозможно из-за нехватки памяти или из-за достижения его максимальной величины, генерируется исключение EStackOverflow. Минимальный размер стека по умолчанию равен 16384 (16K). Этот размер может изменяться параметром minstacksize
директивы {$M} или параметром number директивы {$MINSTACKSIZE}.

Максимальный размер стека по умолчанию равен 1,048,576 (1M). Этот размер может изменяться параметром maxstacksize директивы {$M} или параметром number директивы {$MAXSTACKSIZE number}. Значение минимального размера стека может задаваться целым числом в диапазоне между1024 и 2147483647. Значение максимального размера стека должно быть не менее минимального размера и не более 2147483647. Директивы задания размера стека могут включаться только в программу и не должны использоваться в библиотеках и модулях.

В Delphi 1 имеется процедура компилятора {$S}, осуществляющая переключение контроля переполнения стека. Теперь этот процесс полностью автоматизирован и директива {$S} оставлена только для обратной совместимости.


4) Директивы компилятора, включающие и выключающие генерацию информации времени выполнения о типах (runtime type information - RTTI).

По умолчанию {$M-} или {$ TYPEINFO OFF}

Область действия локальная

Описание

Директивы компилятора $I включают или выключают генерацию информации времени выполнения о типах (runtime type information - RTTI). Если класс объявляется в состоянии {$M+} или является производным от класса объявленного в этом состоянии, то компилятор генерирует RTTI о его полях, методах и свойствах, объявленных в разделе published. В противном
случае раздел published в классе не допускается. Класс TPersistent, являющийся предшественником большинства классов Delphi и все классов компонентов, объявлен в модуле Classes в состоянии {$M+}. Так что для всех классов, производных от него, заботиться о директиве {$M+}не приходится.





5) Директивы компилятора, включающие и выключающие проверку переполнения при целочисленных операциях

По умолчанию {$Q-} или {$OVERFLOWCHECKS OFF}

Область действия локальная

Описание

Директивы компилятора $Q включают или выключают проверку переполнения при целочисленных операциях. Под переполнением понимается получение результата, который не может сохраняться в регистре компьютера. При включенной директиве {$Q+} проверяется переполнение при целочисленных операциях +, -, *, Abs, Sqr, Succ, Pred, Inc и Dec. После каждой из этих операций размещается код, осуществляющий соответствующую проверку. Если обнаружено переполнение,
то генерируется исключение EIntOverflow. Если это исключение не может быть обработано, выполнение программы завершается.

Директивы $Q проверяют только результат арифметических операций. Обычно они используются совместно с директивами {$R}, проверяющими диапазон значений при присваивании.
Директива {$Q+} замедляет выполнение программы и увеличивает ее размер. Поэтому обычно она используется только во время отладки программы. Однако, надо отдавать себе отчет, что отключение этой директивы приведет к появлению ошибочных результатов расчета в случаях, если переполнение действительно произойдет во время выполнении программы. Причем сообщений о подобных ошибках не будет.





6) Директива компилятора, связывающая с выполняемым модулем файлы ресурсов

Область действия локальная

Описание

Директива компилятора {$R} указывает файлы ресурсов (.DFM, .RES), которые должны быть включены в выполняемый модуль или в библиотеку. Указанный файл должен быть файлом ресурсов Windows. По умолчанию расширение файлов ресурсов - .RES. В процессе компоновки компилированной программы или библиотеки файлы, указанные в директивах {$R}, копируются в
выполняемый модуль. Компоновщик Delphi ищет эти файлы сначала в том каталоге, в котором расположен модуль, содержащий директиву {$R}, а затем в каталогах, указанных при выполнении команды главного меню Project | Options на странице Directories/Conditionals диалогового окна в опции Search path или в опции /R командной строки DCC32.

При генерации кода модуля, содержащего форму, Delphi автоматически включает в файл .pas директиву {$R *.DFM}, обеспечивающую компоновку файлов ресурсов форм. Эту директиву нельзя удалять из текста модуля, так как в противном случае загрузочный модуль не будет создан и генерируется исключение EResNotFound.






7) Директивы компилятора, включающие и выключающие проверку диапазона целочисленных значений и индексов

По умолчанию {$R-} или {$RANGECHECKS OFF}

Область действия локальная

Описание

Директивы компилятора $R включают или выключают проверку диапазона целочисленных значений и индексов. Если включена директива {$R+}, то все индексы массивов и строк и все присваивания скалярным переменным и переменным с ограниченным диапазоном значений проверяются на соответствие значения допустимому диапазону. Если требования
диапазона нарушены или присваиваемое значение слишком велико, генерируется исключение ERangeError. Если оно не может быть перехвачено, выполнение программы завершается.

Проверка диапазона длинных строк типа Long strings не производится.
Директива {$R+} замедляет работу приложения и увеличивает его размер. Поэтому она обычно используется только во время отладки.


8) Директива компилятора, связывающая с выполняемым модулем файлы ресурсов

Область действия локальная

Описание

Директива компилятора {$R} указывает файлы ресурсов (.DFM, .RES), которые должны быть включены в выполняемый модуль или в библиотеку. Указанный файл должен быть файлом ресурсов Windows. По умолчанию расширение файлов ресурсов - .RES.
В процессе компоновки компилированной программы или библиотеки файлы, указанные в директивах {$R}, копируются в выполняемый модуль. Компоновщик Delphi ищет эти файлы сначала в том каталоге, в котором расположен модуль, содержащий директиву {$R}, а затем в каталогах, указанных при выполнении команды главного меню Project | Options на странице Directories/Conditionals диалогового окна в опции Search path или в опции /R командной строки DCC32.

При генерации кода модуля, содержащего форму, Delphi автоматически включает в файл .pas директиву {$R *.DFM}, обеспечивающую компоновку файлов ресурсов форм. Эту директиву нельзя удалять из текста модуля, так как в противном случае загрузочный модуль не будет создан и генерируется исключение EResNotFound.

Автор ответа: Cashey



PM MAIL WWW ICQ   Вверх
<Spawn>
Дата 22.1.2004, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Ключевые директивы

{$A+} и {$A-}, {$ALIGN ON} и {$ALIGN OFF} - Директивы компилятора, включающие (выключающие) выравнивание полей записи.

{$B+} и {$B-}, {$BOOLEAVAL ON} и {$BOOLEVAL OFF} - Директивы компилятора, упровляющие вычислением булевых выражений

{$C+} и {$C-}, {$ASSERTIONS ON} и {$ASSERTIONS OFF} - Директивы компилятора, разрешающие или запрещающие проверку утверждений(процедура Assert)

{$D+} и {$D-}, {$DEBUGEINFO ON} и {$DEBUGEINFO OFF} - Директивы компилятора, управляющие включением в модуль отладочной информации

{$DENYPACKAGEUNIT ON} и {$DENYPACKAGEUNIT OFF} - Директивы компилятора, разрешающие или запрещающие включение модуля в пакет.

{$DESIGNONLY ON} и {$DESIGNONLY OFF} - Директива компилятора, управляющая компиляцией пакета в Delphi

{$G+} и {$G-}, {$IMPORTEDDATA ON} и {$IMPORTEDDATA OFF} - Директива компилятора, управляющая импортом данных

{$H+} и {$H-}, {$LONGSTRINGS ON} и {LONGSTRINGS OFF} - Директива компилятора, определяющая значение типа строк string

{$HINTS ON} и {$HINTS OFF} - Директивы компилятора, включающая(выключающая) выдачу замечаний.

{$I+} и {$I-}, {$IOCHECKERS ON} и {$IOCHECKERS OFF} - Директивы компилятора, включающие и выключающие контроль файлового ввода-вывода.

{$J+} и {$J-}, {$WRITEABLECONST ON} и {$WRITEABLECONST OFF} - Директивы компилятора, определяющие, могут ли изменяться значения типизированных констант.

{$IMPLICITBUILD ON} и {$IMPLICITBUILD OFF} - Директивы компилятора, разрешающие или запрещающие перекомпиляцию.

{$L+} и {$L-}, {$LOCALSYMBOLS ON} и {$LOCALSYMBOLS OFF} - Директивы компилятора, разрешающие или запрещающие генерацию информации о локальных символах.

{$M+} и {$M-}, {$TYPEINFO ON} и {$TYPEINFO OFF} - Директивы компилятора, включающие и выключающие генерацию информации времении выполнения о типах(RTTI)

{$ObjExportAll ON} и {$ObjExportAll OFF} - Директивы компилятора, управляющие экспортом символов.

{$O+} и {$O-}, {$OPTIMIZATION ON} и {$OPTIMIZATION OFF} - Директивы компилятора, управляющие оптимизацией.

{$P+} и {$P-}, {$OPENSTRINGS ON} и {$OPENSTRINGS OFF} - Директивы компилятора, управляющие способом представления строковых параметров.

{$Q+} и {$Q-}, {$OVERFLOWSCHECKS ON} и {$OVERFLOWSCHECKS OFF} - Директивы компилятора, включающая и выключающая проверку переполнения при целочисленных операциях.

{$R+} и {$R-}, {$RANGECHECKS ON} и {$RANGECHECKS OFF} - Директивы компилятора, включающие и выключающие проверку диапазона целочисленных значений и индексов.

{$REALCOMPATIBILITY ON} и {$REALCOMPATIBILITY OFF} - Директивы компилятора, управляющие интерпритацией типа Real:Double или Real48.

{$RUNONLY ON} и {$RUNONLY OFF} - Директивы компилятора, определяющие пакет как пакет только времени выполнения.

{$SetPEFlags} и {$SetPEOptFlags} - Директивы компилятора,определяющие пакет как пакет только времени выполнения.

{$T+} и {$T-}, {$TYPEDADDRESS ON} и {$TYPEDADDRESS OFF} - Директивы компилятора, управляющие типами указателей, генерируемых операцией @.

{$U+} и {$U-}, {$SAFEDIVIDE ON} и {$SAFEDIVIDE OFF} - Директивы компилятра, включающие и выключающие устранение ошибок ранних версий процессоров Pentium.

{$V+} и {$V-}, {$VARSTRINGCHECKS ON} и {$VARSTRINGCHECKS OFF} - Директивы проверки коротких строк, передаваемых как параметры.

{$WARNING ON} и {$WARNING OFF} - Директивы компилятора, включающие и выключающие выдачу предупреждений.

{$WEAKPACKAGEUNIT ON} и {$WEAKPACKAGEUNIT OFF} - Директивы компилятора, управляющие формой хранения модуля в пакете.

{$W+} и {$W-}, {$STACKFRAMES ON} и {$STACKFRAMES OFF} - Директивы компилятора, управляющией генерацией стека функций и процедур.

{$X+} и {$X-}, {$EXTENDEDSYNTAX ON} и {$EXTENDEDSYNTAX OFF} - Директивы компилятора, включающие и выключающие расширеный синтаксис Object Pascal.

{$Y+}, {$Y-}, {$REFERENCEINFO ON}, {$REFERENCEINFO OFF}, {$DEFINITIONINFO ON}, {$DEFINITIONINFO OFF} - Директивы компилятора, управляющие генерацией информации о ссылках на символы.


Директивы параметров

{$APPTYPE GUI} и {$APPTYPE CONSOLE} - Директивы, определяющие тип приложения.

{$D} или {$DESCRIPTION} - Директивы компилятора, задающие описание приложения.

{$E} - директива компилятора, задающая расширение исполняемого файла.

{$EXTERNALSYM} - Директива компилятора, задающая имя идентификатора, который должен рассматриваться как external.

{$HPPEMIT} - Директива компилятора, задающая код, помещаемый в заголовочный файл.

{$I} или {$INCLUDE} - Директива компиляторра, включающая в код указаный файл.

{$IMAGEBASE} - Директива компилятора, задающая желательный адрес загрузки.

{$L}, {$LINK} - Директивы компилятора, определяющие компонуемые файлы.

{$M}, {$MINSTACKSIZE}, {$MAXSTACKSIZE}, {$S} - Дирктивы компилятора, определяющие размер стека.

{$NODEFINE} - Директива компилятора, указывающая идентификатор, который не должен включаться в заголовочный файл C++ Builder.

{$NOINCLUDE} - Директива компилятора, указывающая файл, который не должен включаться в заголовочный файл C++ Builder

{$R}, {$RESOURCE} - Директивы компилятора, связывающие с выполняемым модулем файлы ресурсов.

{$Z1}, {$Z2}, {$Z4}, {$Z-}, {$Z+}, {$MINENUMSIZE} - Директивы компилятора, определяющие минимальный размер памяти для перечислимых типов.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Cashey
Дата 22.1.2004, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



DriveSoftware молодец, даже copyright сохранил smile.gif
А дополнения <Spawn> очень ценные вот только если бы их еще и разъеснить...
Вот например как понимать
Цитата
{$B+} и {$B-}, {$BOOLEAVAL ON} и {$BOOLEVAL OFF} - Директивы компилятора, упровляющие вычислением булевых выражений

Что именно она управляет?


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
x77
Дата 22.1.2004, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



например, выражение

if (A <> 0) and (10 / a) then
...

если включена $B+ и а=0, тогда прога может вылететь в ошибку. потому что она будет полностью рассчитывать логическое выражение. а вот когда директива отключена, и а = 0, компилятор просто сразу перейдёт на следующий операнд, т.к. выражение заведомо есть ложь.

по умолчанию эта директива отключена, и не включать её без крайней необходимости не следует smile.gif


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
<Spawn>
Дата 22.1.2004, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Кстати, так же еще есть директивы условной компиляции(в Си их еще директивами препроцессора называют):
{$IFDEF <идентификатор>} - проверка определения, указаного идентификатора.
{$IFNDEF <идентификатор>} - противоположна по смыслу $IFDEF
{$DEFINE <идентификатор>} - определение условного идентификатора
{$UNDEF <идентификатор>} - отмена определения условного идентификатора
{$Ifxxx}, где xxx может быть следующие значения - VER140, MSWINDOWS, WIN32, LINUX, CPU386, CONSOLE, CONDITIONAL -
{$ELSE} - выполнение кода в слечае если $IFDEF($IFxxx) вернула False
{$ENDIF} - окончание кода условной компиляции
{$IFOPT <ключевая директива>} - проверка включенности указаной директивы.

Например:

Код

{$DEFINE Test}

...
procedure TForm1.Button1Click(Sender: TObject);
begin
 {$IFDEF Test}
   ShowMessage('Test defined');
 {$ELSE}
   ShowMessage('Test undefined');
 {$ENDIF}
end;
...
{$UNDEF Test}

В зависимости от того определен ли условный идентификатор Test будет сгенерирован соответствующий код.

Можно по идее сделать систему подобную СИ, для импорта соответствующих функции(ANSI или UNICODE):

Код
 {$IFNDEF UNICODE}
   function GlobalAddAtom(lpString: PAnsiChar): ATOM; stdcall; external kernel32 name 'GlobalAddAtomA';
 {$ELSE}
   function GlobalAddAtom(lpString: PWideChar): ATOM; stdcall; external kernel32 name 'GlobalAddAtomW';
 {$ENDIF}


Т.е. если определить условный идентификатор UNICODE то будет использоваться Unicode версия функции, иначе ANSI.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Medved
Дата 23.1.2004, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: 14
Всего: 154



Вопрос повторяется с переодичностью раз в три месяца.
Советую сделать поиск по форуму.

(вот, не поленился, нашел...)


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Cashey
Дата 17.10.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Есть еще опции в проекте дублирующие некоторые директивы. Так
Цитата(p0s0l @  17.8.2003,  18:32 Найти цитируемый пост)
есть директива {$J+} или Project->Options->Compiler->Assignable Typed Constants

И судя по всему есть аналогичная установка для директивы {$H+}. Вот только какая я не знаю...  smile 


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Cashey
Дата 17.10.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Цитата(Cashey @  17.10.2006,  15:37 Найти цитируемый пост)
И судя по всему есть аналогичная установка для директивы {$H+}. Вот только какая я не знаю...

кажется там же, галочка Huge Strings


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0908 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.