Delphi$IFDEF WIN32无法使用$ELSE

Delphi$IFDEF WIN32无法使用$ELSE,delphi,conditional-compilation,Delphi,Conditional Compilation,我正在处理的一个项目有一个单元xprocs.pas,它有一个正在运行的{$IFDEF}/{$ELSE}块。昨天天气很好,没有任何问题。。。然而,今天早上,它抛出了一个带有范围检查错误的异常。引发错误的代码块由{$IFDEF WIN32}执行,但未按预期执行 如果我对{$IFDEF}块进行注释,并尝试仅在其后面直接运行该行,则它不尊重注释,并且仍然运行它。IDE还允许我在注释掉的代码上放置一个断点 我删除了DCU文件,认为它使用的是旧版本,但没有效果 有什么建议吗 const C1 = 52

我正在处理的一个项目有一个单元xprocs.pas,它有一个正在运行的
{$IFDEF}
/
{$ELSE}
块。昨天天气很好,没有任何问题。。。然而,今天早上,它抛出了一个带有范围检查错误的异常。引发错误的代码块由
{$IFDEF WIN32}
执行,但未按预期执行

如果我对
{$IFDEF}
块进行注释,并尝试仅在其后面直接运行该行,则它不尊重注释,并且仍然运行它。IDE还允许我在注释掉的代码上放置一个断点

我删除了DCU文件,认为它使用的是旧版本,但没有效果

有什么建议吗

const
  C1 = 52845;
  C2 = 22719;

function strEncrypt(const S: String; Key: Word): String;
var
  I: Integer;
begin
 {$IFDEF Win32}
  SetLength(Result,Length(S));
 {$ELSE}
   Result[0]:=Chr(Length(S));
 {$ENDIF}
  for I := 1 to Length(S) do begin
    Result[I] := Char(Ord(S[I]) xor (Key shr 8));
    Key := (Ord(Result[I]) + Key) * C1 + C2;
  end;
end;

该问题最终导致项目文件“ProjectName.dof”损坏。我删除了它,并手动复制了旧版本的编译器设置和搜索路径。

您的系统上有不同版本的.pas或.dcu,并且您看到的代码与编译器看到的不同。在您的系统中搜索其他副本(不仅仅是您知道的副本)。@Ken有一些.dcu的其他副本,我已将其删除。除了我添加的注释外,
xprocs.pas
文件与我在源代码管理中的文件(日期为2010年)相匹配。我没有签出文件,所以我用那里的副本替换了它。然后我做了项目>构建所有没有影响的项目。请不要发布代码的截图。只需粘贴代码。堆栈溢出在语法突出显示方面做得很好。@Jerry我想突出显示断点的情况。我还将添加代码。另一个选项是,您从另一个没有正确CR/LF行结尾的文件(例如网页)复制/粘贴了一些代码。在IDE中关闭该文件,在记事本中打开它,进行一个小更改(例如,添加一个空行,然后删除它)并保存该文件。然后在Delphi中重新打开它。这个问题还存在吗?我冒昧地说,“腐败”不是正确的词。更有可能的是,它将不同版本的文件加载到IDE中,而不是用于编译的版本。关于这个问题的评论也说了很多,而且网站上也有一些关于这个问题的重复。@Craigyong有关于重复的dcu文件或pas中导致断点偏移的行结束问题的建议。我遇到的主要问题是,当var赋值溢出类型时,范围检查错误(在b/c中是欺骗性的,字符串索引没有超出范围)。在上面的代码中,
Key:Word
当其赋值>65535时,它会导致范围检查。替换dof文件暂时修复了它,但最终我显式地转换了值
Key:=Integer((Ord(Result[I])+Key)*C1+C2)然后它停止了。其他地方也发生过。老实说,我也不太清楚为什么。你问题中的代码不是产生范围检查错误的代码。对于非常熟悉Delphi某些方面的人来说,这是非常明显的:注释行上的断点意味着编译代码和编辑器中的代码不同步。必须先解决这个问题,然后才能做出任何合理的决定,继续处理范围检查错误。如果你在这方面仍然有问题,一个新的问题将是合适的。