等待!- 这并不像听起来那么愚蠢的问题。标题很简洁。
我有一些调试代码来验证数据结构的正确性和一些检查这种正确性的断言,我只想在 Debug 构建中启用它们:
{$ifdef DEBUG}
function Sorted : Boolean;
function LinearSearchByValue(const T : TType) : NativeInt;
{$endif}
后来在一个方法中:
assert(Sorted);
例如。
在我启用断言的调试版本中,一切都很好。但是,在我的 Release build with assertions disabled中,该行assert(Sorted);
会导致编译器错误E2003 Undeclared identifier: 'Sorted'
。非常正确,没有声明标识符,但断言也被关闭,不应该被评估或生成任何代码。(试图通过声明方法但没有实现来欺骗断言会导致正常错误“不满足前向或外部声明”。它显然也在寻找方法体。)
这会导致一些混乱的代码,其中必须声明根本不应该存在于 Release 构建中的方法并具有主体,以便编译关闭的断言。
如何在 Delphi 2010 中声明仅存在于调试版本中的方法,并在断言中使用那些也应该只存在于调试版本中的方法?
更多信息:
我尝试用 包装方法声明
{$ifopt C+}
,它检查断言是否打开。调用assert
仍因“未声明的标识符”而失败。编译器选项肯定是关闭了断言。(我检查了 :))
我已经尝试
assert
用{$ifdef DEBUG}
. 但是,这是混乱的,不应该是必需的。在某一时刻,它让我担心即使在发布版本中也会编译断言,出于性能原因,我根本不想要它们。(这没有发生 - 没有生成断言代码。)我目前的策略是一直声明这些方法,但是在 Release 构建中,如果定义方法体,则用一个虚拟结果填充它。这里的目的是编译所有断言,但方法的开销尽可能小,并且它们的返回值(如果它们实际上在发布版本中被调用)显然是错误的。
在 Delphi 中是否有任何与 C/C++ 风格的宏等效的
ASSERT(x)
东西,其中一个宏在发布版本中被简单地定义为空,导致编译器既看不到也不关心断言中的语句?这是在 C++ 中使用宏的少数简洁方法 (IMO) 之一。
因此,虽然没有生成断言,但它们已被编译。这又回到了我的问题:我如何最好地混合调试方法和断言,并发布构建?