1

而不是我只能打字

const clicks : Integer = 1;

我必须输入

{$J+}
const clicks : Integer = 1; 
{$J-}

我认为在编译器选项菜单中选中该框要容易得多..但我想确保它不会因为长期错误而伤害我..并且想知道为什么它会被禁用(未选中)?

我很感激这方面的任何帮助,谢谢你们。

4

3 回答 3

4

自 Delphi 2 IIRC 发布以来,默认设置是禁用它们。实际选项是在 Delphi 1 的对话框中提供的,我似乎记得在下一个版本中默认值已从启用更改为禁用时大惊小怪。不过已经很长时间了,所以当默认值被反转时,我可能会关闭一个;它可能是 D3。可赋值常量是旧 Turbo Pascal 时代的遗留物,是缺乏实际静态变量类型的替代品。它们被一种更好的解决方案所取代,即初始化(全局)变量(请参阅 参考资料Declaring Variables)。

如果您确实需要使用可写常量,则应仅在必要的最小(最有限)范围内这样做,而不是更改全局设置。常数应该是尽可能的(常数)。使用可写常量的典型原因是当您需要某个范围内的局部变量(例如过程、函数或单元)需要在调用之间保持其值时,通常有更好的方法来做到这一点。一些选项是对象字段(成员变量),或有限范围的初始化变量(在受限区域中可见的变量,例如在implementation单元的部分内,并初始化为起始值)。

可赋值常量意味着值可以在运行时更改,并且实际上很少有用。真正的常量就是这样 - 常量 - 并且不应该被允许改变。

对于类型化的常量也可以这样说;应该有使用它们的实际需要,除非您存储常量数组、记录、指针或过程类型,否则很少使用它们,如在这些声明中:

const
  TIntLookupArray: array[0..1] of Integer = (1, 2);
  TErrorMsgs: array[0..1] of string = ('Invalid input', 'Invalid sequence');

您首先使用类型化常量是否有原因?如果你只是使用你不会有这个问题

const clicks = 1;

并让编译器决定正确的类型。如果你想确保它的大小Integer,只需使用类型转换,如

const clicks = Integer(1); 

有关更多信息,请参阅Delphi 文档 docwiki

于 2013-05-30T18:52:20.067 回答
3

只要我记得,可分配的类型常量选项默认情况下就被禁用了。在 Delphi 7 之前的许多版本中默认禁用它。

语言功能设计不佳,因此在我看来,不应使用。这让代码的读者感到困惑。修改常数的想法非常奇怪。可分配类型常量的用例是具有静态(即全局)存储持续时间的局部范围变量。

如果语言设计得当,那么本地范围内的变量就会有静态存储持续时间的地方。但是该设计存在致命缺陷,因为在 Delphi 语言中,由于 const 关键字的重载,您无法轻易地区分可赋值的类型常量和实数常量。

一个理智的设计会引入语法来声明具有静态存储的变量并将它们与常量区分开来。但设计师却选择了编译器选项。或者,也许早在 Turbo Pascal 中,所有类型的常量都是可赋值的。尽管如此,如果没有语言语法支持, const 关键字的重载是根本站不住脚的。

保留编译器选项是为了向后兼容。您不应该使用可分配的类型常量。同样,只要我记得,任何体面的编码标准都禁止使用可分配的类型常量。

我的建议:

  1. 在全局级别禁用可分配的类型常量。
  2. 永远不要在你的代码中使用 $J+。

在现代 Delphi 中,对于具有静态存储持续时间的局部范围变量,最接近的构造是严格的私有类变量。它们在 Delphi 7 中不可用,因此您唯一的选择是全局变量,这是一种相当遗憾的情况。

于 2013-05-30T18:54:14.320 回答
3

我猜它已被禁用,因为“可分配常量”本身就是一个矛盾。您可能可以将您的代码替换为

var
  clicks : Integer = 1;

“可赋值常量”唯一有用的情况是模拟静态局部 C 变量。

于 2013-05-30T18:23:04.037 回答