delphi - 编译器错误? {$ define无法正常工作

标签 delphi

我正在使用10.3.1(4899)。在我项目的表单的最上方,我有几行看起来像这样:

{$ifdef AA}
  {$define BB}
{$endif]
{$define CC}


在我的代码中,检查定义并采取相应措施:

procedure TForm1.Button1Click(Sender: TObject);
begin
  {$ifdef AA}
  ShowMessage('AA');
  {$endif}
  {$ifdef BB}
  ShowMessage('BB');
  {$endif}
  {$ifdef CC}
  ShowMessage('CC');
  {$endif}
end;


也许这应该是竞争:单击按钮时会显示哪个消息?好吧放弃答案是不显示任何消息。是预期的行为,还是错误?

最佳答案

这不是错误。您的代码是错误的。代替

{$ifdef AA}
  {$define BB}
{$endif]
{$define CC}


你应该有

{$ifdef AA}
  {$define BB}
{$endif}
{$define CC}


让我们集中在错误的两行代码上:

{$endif]
{$define CC}


这与单个{$endif}的解释方式完全相同。所以你的代码相当于

{$ifdef AA}
  {$define BB}
{$endif}


因此,观察到的行为。

您可能想知道为什么

{$endif]
{$define CC}


被视为与

{$endif}


和一样

{$endif]{$define CC}


和一样

{$endif you can write anything that you like in here}


和一样

{$endif you can even include left curly braces { }


好吧,我在任何地方都没有看到清楚的文档,但这似乎是设计使然。解析器到达指令的末尾后,它将跳过其他所有内容,直到到达终止的}符号。

例如,documentation gives the following examples of compiler directives

{$B+}
{$R- Turn off range checking}
{$I TYPES.INC}
{$M 32768,40960}
{$DEFINE Debug}
{$IFDEF Debug}
{$ENDIF}


请注意以下示例中的第二个:

{$R- Turn off range checking}


这等效于{$R-}。附加文本将被忽略,可用于记录指令的意图。

因此,这使我得出结论,即使对指令的解析规则似乎没有明确记录,但您观察到的行为是故意的。

关于delphi - 编译器错误? {$ define无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54870967/

相关文章:

delphi - 如何在 Windows 中 Hook 全局快捷方式?

delphi - 使用初始化部分进行模块注册是个好主意吗?

windows - 如何使文件真正不可变(不可删除且只读)?

delphi - 如何找到有关 FireMonkey 的详细信息?

delphi - ManualFloat 不使用指定的 Rect

java - getDeclaredMethods/getDeclaredFields/getConstructors 的替代方法

delphi - 如何获取 Delphi 编译包(.dcp 文件)中的单元列表

image - 带有图像的 Delphi 弹出框

multithreading - 从线程返回字符串 Delphi

delphi - 枚举集大小(x64)