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)
我试过这段代码:
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)
你是对的:一些常数比其他常数更稳定.第二个常量实际上被编译器视为变量.
clHotlight: TColor = $00FF9933;
^
Run Code Online (Sandbox Code Playgroud)
通过引用声明clHotlight为' 变量 '(好吧,如果你在编译器选项中允许这个'可分配常量'):.
正如您所发现的那样,声明:
clHotlight = TColor($00FF9933);
Run Code Online (Sandbox Code Playgroud)
在clHotlight稍后指定之前不进行分配.
这同样适用于您的GUID.
| 归档时间: |
|
| 查看次数: |
6678 次 |
| 最近记录: |