【发布时间】:2010-09-07 13:59:56
【问题描述】:
在查看 Visual C++ 代码库时,我发现了以下奇怪的事情。运行时断言(检查条件并在违反条件时抛出异常)用于可以在编译时评估条件的情况:
assert( sizeof( SomeType ) == sizeof( SomeOtherType ) );
很明显,编译器将评估条件并替换有效的代码
assert( true );
什么都不做或
assert( false );
每次控制通过该行时都会引发异常。
IMO 应该使用编译时断言,原因如下:
- 它将在编译时更早地暴露条件违规 - 并且
- 它将发出更清晰(因此更快更小)的机器代码
看起来编译时断言是唯一正确的事情。是否有任何可能的理由在这里更喜欢运行时断言?
【问题讨论】:
-
assert通常不会抛出异常而是中止程序。 -
到目前为止,还没有标准的编译时断言。这一事实非常重要,尤其是在较旧的代码库中。
-
具体来说,VC6 在整个 Boost 库中都有各种特殊情况代码。如果您的代码现在或曾经是由 VC6 编译的(人们可能会认为这对于许多 MS 自己的源代码都是正确的),至少
BOOST_STATIC_ASSERT可能是不可能的。 -
大多数 asserts() 在发布时编译为空操作。它们仅在 Debug(即测试代码)中有效。
标签: c++ visual-c++ assert error-checking