zoukankan      html  css  js  c++  java
  • C++:运行期断言和编译期断言

    编译时断言和运行时断言
     
    通常为了检测一些条件,我们往往在程序里面加断言。一般只在DEBUG版有效,RELEASE版断言不生成任何代码。C++可以使用两种断言: 静态断言和动态断言,即就是运行期断言和编译期断言!顾名思义,运行期断言是在程序运行过程中判断指定的条件,若条件满足,万事OK,若断言失败,则程序给出提示然后被abort掉;编译期断言是在编译时候检查条件是否满足,不满足情况下,编译器给出错误提示(需要人为实现),只要条件不成立,程序是编译不过的。静态断言,BOOST库有实现(boost/static_assert.hpp),主要原理就是根据"sizeof(不完整类型)"会报错。动态断言在cassert库文件有实现。实现如下:
     
    动态断言:(cassert)
     
    #ifdef NDEBUG
     
    // 不做任何处理
    #  define assert(expr)   
     
    #else
     
    // __assert_failed 打印错误消息(包含表达式串,文件,所在行,所在函数名),然后abort()。
    #  define assert(expr)  ((expr) ? 0 : __assert_failed(__STRING(expr),  __FILE__,  __LINE__, __PRETTY_FUNCTION__, 0))  
     
    #endif
     
    静态断言:(boost/static_assert.hpp)
     
     
    template <bool x> struct STATIC_ASSERTION_FAILURE;
     
    template <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; };
     
    template<int x> struct static_assert_test{};
     
    #define BOOST_STATIC_ASSERT( B ) \
        typedef ::boost::static_assert_test<\
        sizeof(::boost::STATIC_ASSERTION_FAILURE< (bool) (B) >)
        >  boost_static_assert_typedef_
     
    // 当B为false时,sizeof(STATIC_ASSERTION_FAILURE<false>),STATIC_ASSERTION_FAILURE<false>)没有实现(不能实例化),为不完整类,编译器报错!
     
    注意:和动态断言不同的是,静态断言可以在名称空间,类,函数,模板(函数模板和类模板)中使用,因为他用的是typedef。
     
  • 相关阅读:
    最后完整的excel.java文件
    *将制定类型的List写入Excel中
    初始化Excel表格
    单元格的格式设置 字体大小 颜色 对齐方式、背景颜色等
    生成写入excel
    activity_daochu.xml代码
    设计了activity_daochu.xml
    个人作业第二阶段
    阅读笔记一-1软件=程序+软件工程
    每日总结
  • 原文地址:https://www.cnblogs.com/mywolrd/p/1930692.html
Copyright © 2011-2022 走看看