为什么默认情况下在我的Delphi7中禁用了可分配类型常量?

为什么默认情况下在我的Delphi7中禁用了可分配类型常量?,delphi,delphi-7,Delphi,Delphi 7,而不是我只能打字 const clicks : Integer = 1; 我得打字 {$J+} const clicks : Integer = 1; {$J-} 我认为只选中编译器选项菜单中的复选框要容易得多。。但是我想确保这不会伤害我。。想知道为什么它会被禁用(未检查) 非常感谢大家的帮助。我想它已经被禁用了,因为“可分配常数”本身就是一个contadion。您可以用 var clicks : Integer = 1; “可分配常数”唯一稍微有用的情况是模拟一个静态局部C变量。我

而不是我只能打字

const clicks : Integer = 1;
我得打字

{$J+}
const clicks : Integer = 1; 
{$J-}
我认为只选中编译器选项菜单中的复选框要容易得多。。但是我想确保这不会伤害我。。想知道为什么它会被禁用(未检查)


非常感谢大家的帮助。

我想它已经被禁用了,因为“可分配常数”本身就是一个contadion。您可以用

var
  clicks : Integer = 1;

“可分配常数”唯一稍微有用的情况是模拟一个静态局部C变量。

我猜它已被禁用,因为“可分配常数”本身就是一个contadion。您可以用

var
  clicks : Integer = 1;

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

默认情况是在Delphi 2发布后禁用它们,IIRC。实际选项是在Delphi 1的对话框中提供的,我似乎还记得在下一个版本中,默认值从启用变为禁用时有点小题大做。但这已经有很长一段时间了,所以当违约被逆转时,我可以一个一个地离开;可能是D3。可赋值常数是从旧的Turbo-Pascal时代遗留下来的,是缺少实际静态变量类型的替代品。它们被一个更好的解决方案所取代,即初始化(全局)变量(请参阅)

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

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

类型化常量也是如此;应该实际需要使用它们,除非存储常量数组、记录、指针或过程类型(如以下声明中所述),否则很少需要使用它们:

const
  TIntLookupArray: array[0..1] of Integer = (1, 2);
  TErrorMsgs: array[0..1] of string = ('Invalid input', 'Invalid sequence');
首先使用类型化常量有什么原因吗?如果您只使用

const clicks = 1;
并让编译器决定正确的类型。如果要确保它的大小为
整数
,只需使用类型转换,如

const clicks = Integer(1); 

有关更多信息,请参阅。

自Delphi 2发布以来,默认设置是禁用它们,IIRC。实际选项是在Delphi 1的对话框中提供的,我似乎还记得在下一个版本中,默认值从启用变为禁用时有点小题大做。但这已经有很长一段时间了,所以当违约被逆转时,我可以一个一个地离开;可能是D3。可赋值常数是从旧的Turbo-Pascal时代遗留下来的,是缺少实际静态变量类型的替代品。它们被一个更好的解决方案所取代,即初始化(全局)变量(请参阅)

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

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

类型化常量也是如此;应该实际需要使用它们,除非存储常量数组、记录、指针或过程类型(如以下声明中所述),否则很少需要使用它们:

const
  TIntLookupArray: array[0..1] of Integer = (1, 2);
  TErrorMsgs: array[0..1] of string = ('Invalid input', 'Invalid sequence');
首先使用类型化常量有什么原因吗?如果您只使用

const clicks = 1;
并让编译器决定正确的类型。如果要确保它的大小为
整数
,只需使用类型转换,如

const clicks = Integer(1); 

有关更多信息,请参阅。

自我记忆中起,可分配类型常量选项在默认情况下已被禁用。在Delphi7之前的许多版本中,默认情况下都禁用了它

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

如果语言设计得当,那么就可以放置具有静态存储持续时间的局部作用域变量。但是这个设计有致命的缺陷,因为在Delphi语言中,由于const关键字的重载,您无法轻易区分可赋值类型常量和实常量

理智的设计会引入语法来声明具有静态存储的变量,并将它们与常量区分开来。但是设计师选择了编译器选项。或者,早在Turbo Pascal中,所有类型化常量都是可赋值的。都一样,没有