zoukankan      html  css  js  c++  java
  • BOOST_STATIC_ASSERT and BOOST_ASSERT

    boost之编译期断言BOOST_STATIC_ASSERT与assert的区别

    assert是运行期断言,也就是在编译期出现的错误,它不会提示;

    而boost中的BOOST_STATIC_ASSERT是在编译期的断言,也就是说在编译的时候就可以断言出错误。

    比如下面的函数:

    void expects_ints_to_be_4bytes()
    {
            BOOST_STATIC_ASSERT(sizeof(int)!=4);
            assert(sizeof(int)!=4);
    }
    编译的时候就会提示

    static_assert.cpp: In function 'void expects_ints_to_be_4bytes()':
    static_assert.cpp:11: error: invalid application of 'sizeof' to incomplete type             'boost::STATIC_ASSERTION_FAILURE<false>'

    也就是BOOST_STATIC_ASSERT的断言。把这行改成BOOST_STATIC_ASSERT(sizeof(int)==4);再编译,不会提示错误。而assert(sizeof(int)!=4)这行在运行的时候 会提示错误。

    所以,一个是编译期的断言,一个运行期的断言,两个可以起到很好的互补作用

    以下情形下使用 BOOST_STATIC_ASSERT

      • 当条件可以在编译期进行求值

      • 对类型的要求可以在编译期表示

      • 你需要对两个或以上的整型常量间的关系进行断言

    用BOOST_ASSERT代替assert

    (转载请注明来源于金庆的专栏)

    断言assert()简单地输出错误信息并调用abort()退出是相当好用的功能.
    错误信息包括文件名, 代码行, 及出错的表达式.
    (如果能像Java, Python那样获取出错时的调用栈(traceback)就更好了,
    可惜C++中好像无法得到调用栈?)

    出于某些特殊的目的, 可以用BOOST_ASSERT()来代替assert().
    BOOST_ASSERT()比assert()更灵活, (虽然也没有调用栈信息),
    其基本的行为与assert()一致.

    有两点扩展功能:

    1. 可以定义BOOST_DISABLE_ASSERTS来停用BOOST_ASSERT().

    assert通过定义NDEBUG来停用, 但是有时候想要发布一个调试版,
    不能定义NDEBUG, 无法停用assert().
    用BOOST_ASSERT()就多了一个控制选项, 即可以在调试版中停用断言.

    2. 可以定义BOOST_ENABLE_ASSERT_HANDLER, 来调用自定义的断言出错函数.

    如果定义了 BOOST_ENABLE_ASSERT_HANDLER,
    BOOST_ASSERT 失败则调用 ::boost::assertion_failed().
    如果未定义BOOST_ENABLE_ASSERT_HANDLER,则会调用标准的assert().

    boost/assert.hpp中只声明了assertion_failed(), 需要自己定义.
    它有4个参数, 分别是出错表达式串, 函数名, 文件名, 行号.

    有了自定义的断言出错处理函数, 就可以实现断言出错时记录日志并续继执行.
    (个人觉得这不是个好主意, 但被要求如此实现, 只好努力去满足).
    绝妙的是, 可以通过宏来控制自己想要的断言行为.

  • 相关阅读:
    关于时间
    ELK日志平台
    Java web项目
    阳光下的挣扎
    Windows Server 2008 R2无法连接无线网络的解决方法
    像进度条的网页加载Loading JS代码
    JAVASCRIPT网页上下切换的打开特效
    霓虹灯文字代码 JS网页特效
    Js代码动态移动层-拖动浮层并关闭
    JS网页特效:星空飞入效果
  • 原文地址:https://www.cnblogs.com/androidme/p/2892101.html
Copyright © 2011-2022 走看看