我正在使用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/