0
点赞
收藏
分享

微信扫一扫

静态断言 static_assert


文章目录

  • 1.断言
  • 2.静态断言
  • 3. 32 位系统与 64 位系统各数据类型对比:

1.断言

断言(assertion)是一种编程中常用的手段。在通常情况下,断言就是将一个返回值总是需要为真的判断表达式放在语句中,用于排除在设计的逻辑上不应该产生的情况。

比如:一个函数总需要输入在一定的范围内的参数,那么程序员就可以对该参数使用断言,以迫使在该参数发生异常的时候程序退出,从而避免程序陷入逻辑的混乱。

从一些意义上讲,断言并不是正常程序所必需的,不过对于程序调试来说,通常断言能够帮助程序开发者快速定位那些违反了某些前提条件的程序错误。

如果我们要在 C++ 程序中使用断言,需要在程序中包含头文件 或 <assert.h>,头文件中为我们提供了 assert 宏,用于在运行时进行断言。

  • eg:

#include <iostream>
#include <cassert>
using namespace std;

// 创建一个指定大小的 char 类型数组
char* createArray(int size)
{
/*使用了断言 assert(expression) ,
这是一个宏,它的参数是一个表达式,这个表达式通常返回一个布尔类型的值,
并且要求表达式必须为 true 程序才能继续向下执行,否则会直接中断。*/
    // 通过断言判断数组大小是否大于0
    assert(size > 0);	// 必须大于0, 否则程序中断
    char* array = new char[size];
    return array;
}

int main()
{
    char* buf = createArray(0);
    // 此处使用的是vs提供的安全函数, 也可以使用 strcpy
    strcpy_s(buf, 16, "hello, world!");
    cout << "buf = " << buf << endl;
    delete[]buf;
    return 0;
}

  • 测试:如果 createArray 参数小于等于 0,程序运行到 16 行直接退出,会看到如下图的提示信息:

2.静态断言

在上面的例子中我们使用了断言 assert。但 assert 是一个运行时断言,也就是说它只有在程序运行时才能起作用 。

静态断言 static_assert,所谓静态就是在编译时就能够进行检查的断言,使用时不需要引用头文件。静态断言的另一个好处是,可以自定义违反断言时的错误提示信息。

  • 静态断言使用起来非常简单,它接收两个参数:

参数1:断言表达式,这个表达式通常需要返回一个 bool值
参数2:警告信息,它通常就是一段字符串,在违反断言(表达式为false)时提示该信息

由于基于 VS 计算的字节大小和理论值有出入,下面程序基于 64 位 Linux 进行测试,使用静态断言验证当前操作系统是否是 32 位:

  • eg:

// assert.cpp
#include <iostream>                                         
using namespace std;

int main()
{
    // 字体原因看起来是一个=, 其实这是两个=
    static_assert(sizeof(long) == 4, "错误, 不是32位平台...");
    cout << "64bit Linux 指针大小: " << sizeof(char*) << endl;
    cout << "64bit Linux long 大小: " << sizeof(long) << endl;

    return 0;
}

  • 测试:

静态断言条件判断为 true,程序就可以继续向下执行了。

  • 由于静态断言的表达式是在编译阶段进行检测,所以在它的表达式中不能出现变量,也就是说这个表达式必须是常量表达式。

3. 32 位系统与 64 位系统各数据类型对比:

静态断言 static_assert_开发语言

  • 参考:静态断言 static_assert


举报

相关推荐

0 条评论