{$WRITEABLECONST ON/OFF}

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Сообщение Иван Шихалев » 05.09.2005 20:32:39

Директива {$WRITEABLECONST ...}, работает так же, как в Delphi, хотя и недокументирована...
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение STAKANOV » 05.09.2005 21:19:21

Что за деректива?
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Sniper » 05.09.2005 23:28:20

Иван Шихалев писал(а): Директива {$WRITEABLECONST ...}, работает так же, как в Delphi, хотя и недокументирована...

лезем в справку и читаем:

Type Switch
Syntax {$J+} or {$J-}
{$WRITEABLECONST ON} or {$WRITEABLECONST OFF}
Default {$J-}
{$WRITEABLECONST OFF}
Scope Local
The $J directive controls whether typed constants can be modified or not. In the {$J+} state, typed constants can be modified, and are in essence initialized variables. In the {$J-} state, typed constants are truly constant, and any attempt to modify a typed constant causes the compiler to report an error.
Writeable consts refers to the use of a typed const as a variable modifiable at runtime. For example:

const

foo: Integer = 12;
begin
foo := 14;

end.

With $WRITEABLECONST OFF, this code produces a compile error on the assignment to the foo variable in the begin..end block. To fix it, change the const declaration to a var declaration.

In early versions of Delphi and Borland Pascal, typed constants were always writeable, corresponding to the {$J+} state. Old source code that uses writeable typed constants must be compiled in the {$J+} state, but for new applications it is recommended that you use initialized variables and compile your code in the {$J-} state.
Sniper
постоялец
 
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение STAKANOV » 06.09.2005 08:54:16

Бред полнейший. Зачем это нужно не понятно. Похоже разарботчики уже просто развлекаются. Константа на то и константа, что ее значение изменять нельзя.
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Sniper » 06.09.2005 11:29:44

STAKANOV писал(а): Бред полнейший. Зачем это нужно не понятно. Похоже разарботчики уже просто развлекаются. Константа на то и константа, что ее значение изменять нельзя.

деньжат им подкинь, они будут нужное делать... а пока это бесплатно и с исходниками, то нужно принимать С БЛАГОДАРНОСТЬЮ ТО, что дают
Sniper
постоялец
 
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение Boriss » 06.09.2005 15:21:54

Бред полнейший. Зачем это нужно не понятно. Похоже разарботчики уже просто развлекаются. Константа на то и константа, что ее значение изменять нельзя

Не, мужики, типизированная константа - это, грубо говоря, инициализированная переменная, а нетипизировнная - "истинная" и при компиляции вместо ее упоминания подставляется значение. Вот поэтому ее и не получается изменить
См. описание формата .bss разные там ...
А тут возможность и типизированную не разрешается менять. Как это работает еще не смотрел.
Boriss
незнакомец
 
Сообщения: 8
Зарегистрирован: 31.08.2005 15:17:34

Сообщение Иван Шихалев » 06.09.2005 17:42:03

лезем в справку и читаем:

У меня в prog.pdf от 2.0 ничего не написано...
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение PVOzerski » 07.09.2005 11:44:38

Интересно, если off. это на оптимизации кода как-то отражается. Потому как иначе смысла в этом оff меньше, чем проблем. В "нашем" паскале (в том числе от Borland'а) ведь это единственный способ иметь статические локальные переменные.
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Сообщение Иван Шихалев » 07.09.2005 18:51:05

В "нашем" паскале (в том числе от Borland'а) ведь это единственный способ иметь статические локальные переменные.

Они не локальны: инициализация производится один раз, затем текущее значение сохраняется.

OFF имеет смысл не только для оптимизации, но и для надежности — аналогично const-параметрам.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Сообщение Boriss » 08.09.2005 09:38:08

Вот в чем дело:
Формат COFF делит объектный код на разделы. Раздел .text содержит выполнимый код, раздел .data - переменные с начальными значениями, а раздел .bss - неициализированные данные

То есть, неинициализированные переменные (var) создаются в разделе .bss
Типизированные константы в .dat
А просто константы - нигде не хранятся, а просто заменяются значениями во время компиляции
Boriss
незнакомец
 
Сообщения: 8
Зарегистрирован: 31.08.2005 15:17:34

Сообщение PVOzerski » 08.09.2005 11:21:54

2Иван Шихалев - да понятно, что они на самом деле не локальны, а локальны только с точки зрения синтаксиса языка - так это и ценится :)
PVOzerski
постоялец
 
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб

Сообщение Иван Шихалев » 08.09.2005 19:33:34

2Иван Шихалев - да понятно, что они на самом деле не локальны, а локальны только с точки зрения синтаксиса языка - так это и ценится

Фокусы это. Не люблю. А если завтра реализация изменится и они таки станут локальными?
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 27

Рейтинг@Mail.ru