我在Delphi7中遇到了后台编译器的问题:在我的项目中有一行代码会导致后台编译器停止并显示错误消息,因此无法进行CodeCompletion.正常的编译器和语法检查对此代码没有问题,并且生成的应用程序是正确的.
我的问题是,在执行后台编译时是否有任何方法可以跳过此代码行(例如编译器指令).
重现错误的示例代码:
procedure ProduceKibitzError;
var
v : Variant;
begin
v.End; // This line stops kibitz compiler
end;
Run Code Online (Sandbox Code Playgroud)
此代码放在主单元中使用的单元"Error.pas"中.如果您尝试在主单元中调用CodeCompletion,它将停止并显示消息"Error.pas无法编译"(实际消息为德语).
有趣的是,错误只发生在项目编译或第一次执行语法检查之前.编译完成后,CodeCompletion正在运行,必须重新启动Delphi才能重现错误.
更新: 添加带有结束标签的空Assembler块是问题的解决方案.以下是不会停止后台编译器的更改示例代码:
procedure ProduceKibitzError;
var
v : Variant;
begin
asm
@@END:
end;
v.End;
end;
Run Code Online (Sandbox Code Playgroud)
非常感谢,
基督教
Bar*_*lly 10
在解析到达光标位置时,后台编译器不进行过程体分析.相反,它使用简单的语法匹配(例如begin/ endpairs).如果简单的语法匹配表明end单元中的final 已经满足,则它会提前退出.
这就是你的例子所发生的事情.第一个End标记不会被后期绑定逻辑转义,因为它不是由真实表达式编译器解析的,而是作为过程的结尾读取.第二个end看起来像单元的结尾,后台编译器再也看不到了.
补充:您可以尝试在此例程中添加一个空的asm/end块.它阻止了kibitz编译器跳过程序分析.Graphics.pas有一个带有@@ end标签的asm/end块,编译器因此特别处理asm/end块.