zoukankan      html  css  js  c++  java
  • C++11 assert/static_assert

    assert


    assert 是运行期断言,它用来发现运行期间的错误,不能提前到编译期发现错误,
    也不具有强制性,也谈不上改善编译信息的可读性,既然是运行期检查,对性能当然是
    有影响的,所以经常在发行版本中,assert 都会被关掉。
    assert 的关键在于判断 expression 的逻辑真假,如果为 false,就会在 stderr 上面打
    印一条包含“表达式,文件名,行号”的错误信息,然后调用 abort 结束整个程序。

    #include <iostream>
    #include <assert.h>
    using namespace std;
    char * myStrcpy(char *dest, const char *src)
    {
        assert(dest); assert(src);
        while(*dest++ = *src++);
    } 
    
    int main(int argc, char *argv[])
    { 
        // char buf[1024]; char * p = NULL;
        // myStrcpy(buf,p);
        // cout<<buf<<endl;
        FILE *fp = fopen("aa.c","r");
        assert(fp);
        return 0;
    }

    static_assert
      static_assert 这个关键字,用来做编译期间的断言,因此叫做静态断言。其语法很简单:static_assert(常量表达式,提示字符串)

      如果第一个参数常量表达式的值为真(true 或者非零值),那么 static_assert 不做任何事情,就像它不存在一样,否则会产生一条编译错误,错误位置就是该 static_assert语句所在行,错误提示就是第二个参数提示字符串。

      使用 static_assert,我们可以在编译期间发现更多的错误,用编译器来强制保证一 些契约,并帮助我们改善编译信息的可读性,尤其是用于模板的时候。

      static_assert 可以用在全局作用域中,命名空间中,类作用域中,函数作用域中,几乎可以不受限制的使用。

      编译器在遇到一个 static_assert 语句时,通常立刻将其第一个参数作为常量表达式进行演算,但如果该常量表达式依赖于某些模板参数,则延迟到模板实例化时再进行演算,这就让检查模板参数成为了可能。 

    #include <iostream>
    using namespace std;
    
    static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");
    
    //该 static_assert 用来确保编译仅在 32 位的平台上进行, 不支持 64 位的平台, 该
    语句可以放///在文件的开头处, 这样可以尽早检查, 以节省失败情况下的编译时间。
    
    template<typename T, typename U>
    int my_bit_copy(T& a, U& b)
    {
        static_assert(sizeof(a) == sizeof(b), "parameters must have same width");
    } 
    
    int main(int argc, char *argv[])
    {
        int a; float b;
        my_bit_copy(a,b);
        char c;
        my_bit_copy(a,c);
        return 0;
    }




  • 相关阅读:
    HarmonyOS Java UI之AdaptiveBoxLayout布局示例
    【鸿蒙开发板试用报告】OneNet平台+开发板实时监控温湿度(一)
    安装了瑞友天翼4.0后出现了远程桌面无法连接的问题
    CISVC.EXE的资源占用
    Delphi如何在窗体标题栏添加按钮
    Delphi中捕捉窗体的最小化、最大化、还原消息
    打印机任务无法删除
    Delphi创建一个虚幻的层窗口(Win2000/XP)
    工资年结时提示“上年数据已经结转”
    Delphi中如何控制其他程序窗体上的窗口控件
  • 原文地址:https://www.cnblogs.com/wangkeqin/p/9297193.html
Copyright © 2011-2022 走看看