【发布时间】:2018-11-16 20:55:40
【问题描述】:
我使用的是 Delphi 10.2。我在调用 TList.Last 时遇到问题。 Evaluate 窗口告诉我函数的代码已被链接器删除。
代码sn-ps:
uses
ModelObjects,
ProximitySearch,
System.Classes,
System.UITypes,
System.Generics.Collections,
Winsoft.FireMonkey.FPdfView,
Winsoft.FireMonkey.PDFium;
...
type
TWidgetFinder = class(TObject)
private
fFieldInfos: TList<TFieldInfo>;
fPAnnotation: FPDF_ANNOTATION;
...
procedure TWidgetFinder.ConfigureFieldInfo;
var
key: String;
buffer: TBytes;
textLen: LongWord;
temp: String;
begin
...
SetLength(buffer, KShortBufferLength);
textLen := FPDFAnnot_GetStringValue(fPAnnotation, ToStringType(key), buffer, Length(buffer))
temp := TEncoding.Unicode.GetString(buffer, 0, textLen - 2);
fFieldInfos.Last.Name := TEncoding.Unicode.GetString(buffer, 0, textLen - 2);
...
问题是 fFieldInfos.Last.Name 为空。我以为我没有正确地将缓冲区转换为字符串。但是正确的字符串被写入 temp。当我分配给它后评估 fFieldInfos.Last.Name 时,我收到以下消息:
Function to be called, {System.Generics.Collections}TList<ModelObjects.TFieldInfo>.Last, was eliminated by linker
我已经看到建议我在初始化期间无害地调用消除函数的 SO 解决方案。但它不可能是 Delphi 随机消除代码,我必须发现每个消除都是一个错误。我不明白我做了什么告诉链接器 TList.Last 在我清楚地使用它时没有被使用。有人可以帮我理解这一点吗?
谢谢
【问题讨论】:
-
这是一个调试器问题。代码很好。没有任何不应该被淘汰的东西。
-
如果你的那部分代码可能在某个条件子句或循环中?
-
链接器消除了实际代码。循环和变量可能已更改为使用寄存器,函数可能已被内联,等等......因此,调试器无法再找到它,但实际的 功能 仍然存在。如果这在调试时给您带来麻烦,请转到项目 -> 选项 -> 编译,并确保取消选中“优化”。
-
尝试将错误归咎于优化似乎没有成效。 David Heffernan 的评论提醒我,我曾在多年前看到过在 Delphi 的调试器中运行的消除代码。所以我相信他的话,决定相信这个功能确实存在,然后继续前进。该代码现在似乎正在运行。感谢您的帮助。
标签: delphi