有没有理由使用运行时断言而不是编译时断言?

时间:2010-09-07 13:59:56

标签: c++ visual-c++ assert error-checking

在回顾Visual C ++代码库时,我发现了以下奇怪的事情。如果可以在编译时评估条件,则使用运行时断言(检查条件并在违反条件时抛出异常):

assert( sizeof( SomeType ) == sizeof( SomeOtherType ) );

显然编译器将评估条件并替换有效的代码

assert( true );

什么都不做或

assert( false );

每次控件通过该行时都会抛出异常。

IMO应该使用编译时断言,原因如下:

  • 它会在编译时更早地暴露条件违规 - 和
  • 它会让清洁(因此更快更小)的机器代码发出

看起来编译时断言是唯一正确的事情。有没有可能的理由在这里选择运行时断言?

2 个答案:

答案 0 :(得分:16)

没有理由在这里选择运行时断言。您应该更喜欢编译时错误而不是运行时错误,因此在两者之间选择运行时断言时,绝不会有任何理由。

但是,如果静态断言不是一个选项(不知道静态断言的概念,不知道如何制作一个并且没有一个可用,或者知道如何制作一个但不知道如何没有时间,运行时断言是下一个最好的事情。

使用C ++ 0x,内置的static_assert功能应该结束所有使用运行时断言的理由,其中编译时断言可以工作。

答案 1 :(得分:4)

没有上下文我们无法分辨。在模板代码中,某些分支可能无法访问某些实例。编译时断言是不合适的,因为这会使整个函数变形。 assert(<type-dependent expression>)没有。

E.g。

template <typename T> void foo(T t)
{
  if (t < 0) {
    assert(std::numeric_limits<T>::min() < 0);
    T u = t - std::numeric_limits<T>::min();
  }
}

断言无法转换为静态断言,即使运行时断言永远不会失败。