Delphi:所有常量都是常数,但有些常数比其他常量更常量?

Ian*_*oyd 22 delphi compiler-errors constants delphi-5 compiler-constants

考虑:

const 
   clHotlight: TColor = $00FF9933;
   clLink = clHotLight; //alias of clHotlight

[Error] file.pas: Constant expression expected
Run Code Online (Sandbox Code Playgroud)

和替代措辞有效:

const 
   clHotlight = TColor($00FF9933);
   clLink = clHotLight; //alias of clHotlight
Run Code Online (Sandbox Code Playgroud)

说明.


然后考虑:

const 
   AdministratorGUID: TGUID = '{DE44EEA0-6712-11D4-ADD4-0006295717DA}';
   SuperuserGUID = AdministratorGUID; //alias of AdministratorGUID

[Error] file.pas: Constant expression expected
Run Code Online (Sandbox Code Playgroud)

并修复.

编辑:const在声明之前添加关键字; 有人不相信他们是常设.

Fra*_*ois 23

clHotlight: TColor = $00FF9933;不是常量而是类型常量(=静态变量),即编译器在内存中为TColor保留一个插槽,该插槽$00FF9933最初将在运行时保存该值.
因为该值可以在以后更改(使用Assignable Const选项为ON),所以它不是真正的常量,并且不能被编译器接受clLink = clHotLight;

clHotlight = TColor($00FF9933);clHotlight = $00FF9933;
它是一个真正的常量严格相同,编译器将在代码中出现的任何位置替换clHotlight它的值$00FF9933.而且clLink也是如此.

阅读这个SO问题(在Delphi 7中,为什么我可以为const赋值?)以及那里的所有好答案......

编辑:关于TGUID ...
问题是写作不合适AdministratorGUID: TGUID = '{DE44EEA0-6712-11D4-ADD4-0006295717DA}';.
它使用一些编译器魔法来调用StringToGUID场景,允许方便地将GUID表示为字符串,它们本质上不是.他们是记录.

所以,尝试AdministratorGUID = '{DE44EEA0-6712-11D4-ADD4-0006295717DA}';不会奏效.那不是GUID ......

解决方法是使用指令获得一个类型化常量和指向同一内存区域的变量absolute:

const
   AdministratorGUID: TGUID = '{DE44EEA0-6712-11D4-ADD4-0006295717DA}';
var
   SuperuserGUID: TGUID absolute AdministratorGUID; //alias of AdministratorGUID
   RootGUID: TGUID absolute AdministratorGUID;      //alias of AdministratorGUID
Run Code Online (Sandbox Code Playgroud)


LeG*_*GEC 7

我试过这段代码:

  const
    CAnswer1 = 42;
    CAnswer2 : Integer = 42;

  var
    LAnswer : Integer;

  begin
    LAnswer := CAnswer1;
    LAnswer := CAnswer2;
  end;
Run Code Online (Sandbox Code Playgroud)

这是生成的代码:

Project9.dpr.18: LAnswer := CAnswer1;
004101AC C7056C6E41002A00 mov [$00416e6c],$0000002a //<- assign a hard-coded "42" value
Project9.dpr.19: LAnswer := CAnswer2;
004101B6 A1701C4100       mov eax,[$00411c70] //<- fetch a variable's content
004101BB A36C6E4100       mov [$00416e6c],eax //<- assign this content 
Run Code Online (Sandbox Code Playgroud)

你是对的:一些常数比其他常数更稳定.第二个常量实际上被编译器视为变量.


Bri*_*ost 5

clHotlight: TColor = $00FF9933; 
          ^
Run Code Online (Sandbox Code Playgroud)

通过引用声明clHotlight为' 变量 '(好吧,如果你在编译器选项中允许这个'可分配常量'):.

正如您所发现的那样,声明:

clHotlight = TColor($00FF9933); 
Run Code Online (Sandbox Code Playgroud)

clHotlight稍后指定之前不进行分配.

这同样适用于您的GUID.

  • 没关系,伊恩.该选项仅控制它们是否可分配.它不控制它们的存储方式. (2认同)

归档时间:

查看次数:

6678 次

最近记录:

15 年,10 月 前