{$WRITEABLECONST ON/OFF}

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

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

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

Сообщение Иван Шихалев »

Директива {$WRITEABLECONST ...}, работает так же, как в Delphi, хотя и недокументирована...
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Что за деректива?
Sniper
постоялец
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение Sniper »

Иван Шихалев писал(а): Директива {$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.
Аватара пользователя
STAKANOV
энтузиаст
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV »

Бред полнейший. Зачем это нужно не понятно. Похоже разарботчики уже просто развлекаются. Константа на то и константа, что ее значение изменять нельзя.
Sniper
постоялец
Сообщения: 472
Зарегистрирован: 28.05.2005 13:02:42

Сообщение Sniper »

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

деньжат им подкинь, они будут нужное делать... а пока это бесплатно и с исходниками, то нужно принимать С БЛАГОДАРНОСТЬЮ ТО, что дают
Boriss
незнакомец
Сообщения: 8
Зарегистрирован: 31.08.2005 15:17:34

Сообщение Boriss »

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

Не, мужики, типизированная константа - это, грубо говоря, инициализированная переменная, а нетипизировнная - "истинная" и при компиляции вместо ее упоминания подставляется значение. Вот поэтому ее и не получается изменить
См. описание формата .bss разные там ...
А тут возможность и типизированную не разрешается менять. Как это работает еще не смотрел.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

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

У меня в prog.pdf от 2.0 ничего не написано...
PVOzerski
постоялец
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб
Контактная информация:

Сообщение PVOzerski »

Интересно, если off. это на оптимизации кода как-то отражается. Потому как иначе смысла в этом оff меньше, чем проблем. В "нашем" паскале (в том числе от Borland'а) ведь это единственный способ иметь статические локальные переменные.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

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

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

OFF имеет смысл не только для оптимизации, но и для надежности — аналогично const-параметрам.
Boriss
незнакомец
Сообщения: 8
Зарегистрирован: 31.08.2005 15:17:34

Сообщение Boriss »

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

То есть, неинициализированные переменные (var) создаются в разделе .bss
Типизированные константы в .dat
А просто константы - нигде не хранятся, а просто заменяются значениями во время компиляции
PVOzerski
постоялец
Сообщения: 109
Зарегистрирован: 19.05.2005 13:45:10
Откуда: СПб
Контактная информация:

Сообщение PVOzerski »

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

Сообщение Иван Шихалев »

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

Фокусы это. Не люблю. А если завтра реализация изменится и они таки станут локальными?
Ответить