delphi – 如何在发布版本中使用依赖于仅调试代码编译的assert()
等待! – 这听起来并不是一个愚蠢的问题.标题简洁明了.
我有一些调试代码来验证数据结构的正确性和一些断言检查这个正确性,我只想在Debug构建中启用它: {$ifdef DEBUG} function Sorted : Boolean; function LinearSearchByValue(const T : TType) : NativeInt; {$endif} 后来在一个方法中: assert(Sorted); 例如. 在启用断言的调试版本中,一切都很好.但是,在我的Release版本中,如果禁用了断言,那么行断言(Sorted);导致编译器错误E2003 Undeclared标识符:’Sorted’.这是正确的,标识符未声明,但断言也被关闭,不应被评估或生成任何代码. (试图通过声明方法来欺骗断言但没有实现导致正常错误’不满意的前向或外部声明’.它显然也在寻找方法体.) 这导致了一些混乱的代码,其中必须声明Release版本中不应存在的方法并且具有正文,以便编译断开的断言. 如何在Delphi 2010中声明仅存在于调试版本中的方法,并在断言中使用那些也应仅存在于调试版本中的方法? 更多信息: >我尝试用{$ifopt C}包装方法声明,检查断言是否已打开.对assert的调用仍然以’未声明的标识符’失败. 因此,虽然没有生成断言,但它们是编译的.这回到我的问题:我如何最好地混合仅调试方法和断言,并发布版本? 解决方法
不要从发布版本中排除代码.将代码保留在那里,并无条件地编译.
反对让代码存在于发布版本中的论点是它“混乱”.但是你已经编写了代码,所以无论编译与否,它都会变得混乱.你也可以让编译器编译它;毕竟,编译额外的代码并不需要花费更长的时间. 试图排除与断言相关的代码只会通过要求条件编译指令使代码变得更加混乱. 断言和调试信息是正交设置.如果没有调试,则可以启用断言,反之亦然. 另一种方法是将与断言相关的代码移动到单元测试中.然后它们会自动从您的应用程序的所有版本中排除,但它们仍可用于测试. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |