zoukankan      html  css  js  c++  java
  • C++> static_assert静态断言与assert动态断言

    1. static_assert

    static_assert静态断言,是C++关键字,作用是让编译器在编译期对常量表达时进行断言。如果通过,就不报错;如果不通过,就报错
    用法:

    static_assert(常量表达式, 错误提示信息);
    

    常量表达式的值为true或者false,或者可以转化为true/false。
    如果断言不通过,程序编译也不会通过。

    2. assert

    assert动态断言,从C继承过来的宏定义,头文件assert.h。
    从下面源码可以看到,assert是把表达式通过static_cast转换成bool类型,从而实现断言。

    // # if defined __cplusplus
    
    #  define assert(expr)							
         (static_cast <bool> (expr)						
          ? void (0)							
          : __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))
    

    assert不管断言是否通过,都不会影响编译。

    3. static_assert与assert主要区别

    • 断言通关是否影响编译
      static_cast: 断言不通过编译出错,因为是编译器在编译器进行检查;
      assert: 断言不通过不会影响编译,程序运行时检查;
    static const int a = 0;
    static_assert(a > 1, "error1");  // 无法通过编译
    static_assert(a > -1, "error2"); // 可以通过编译
    
    assert(0); // 可以通过编译, 但无法继续运行
    assert(1); // 可以通过编译, 可以继续运行
    
    • 是否影响程序运行效率
      static_assert: 所包含的代码不会生成目标代码,不会影响程序性能;
      assert: 会影响程序性能,常用于调试阶段,正式释放软件时通常关闭assert功能;

    参考c++静态断言(static_assert)

  • 相关阅读:
    那些陌生的C++关键字
    从实现装饰者模式中思考C++指针和引用的选择
    单例模式(Singleton)
    命令模式(Command)
    抽象工厂模式(Abstract Factory)
    《Effective C++》读书摘要
    桥接模式(Bridge)
    适配器模式(Adapter)
    设计模式学习心得
    黑客常用WinAPI函数整理
  • 原文地址:https://www.cnblogs.com/fortunely/p/14563489.html
Copyright © 2011-2022 走看看