【发布时间】:2017-09-17 15:17:44
【问题描述】:
在我帮助维护的代码中,我发现了多个如下代码示例:
Description := IfThen(Assigned(Widget), Widget.Description, 'No Widget');
我预计当 Widget 为 nil 时它会崩溃,但当我测试它时,它运行良好。
如果我在项目 - 选项 - 编译器中关闭“代码内联控件”重新编译它,我确实会遇到访问冲突。
看来,因为 IfThen 被标记为内联,如果 Widget 为 nil,编译器通常不会评估 Widget.Description。
有什么理由应该“修复”代码,因为它似乎没有被破坏?他们不希望不必要地更改代码。 它会咬它们吗?
我已经用 Delphi XE2 和 XE6 对其进行了测试。
【问题讨论】:
-
这确实是一个基于意见的问题。由你决定。有些人会改变它,有些人不会。
-
谢谢@David 和 Victoria 如果没有充分的理由改变它,他们宁愿不改变。他们不太可能更改内联选项。
-
这不是编译器错误吗?内联不应该改变可观察到的行为。但显然它适用于
IfThen。比如x := IfThen(SomeCondition, GetXWithSideEffect1, GetXWithSideEffect2);。 -
@Uli,你为什么这么想?这里没有额外的魔法。如果您不内联该函数,则会在将所有参数传递给函数之前对其进行评估。如果这样做,内联函数会在需要时在内联代码中“评估它们”。
-
例如在 C++ 中内联不允许改变 obersvable 行为。我确实认为这是一个错误。事实上,我对此感到震惊,我花了一段时间才吸收这个事实。我一直相信内联不会改变可观察到的行为。回到绘图板。
标签: delphi