2026/7/1 9:21:57

断言及静态断言

断言及静态断言 断言是一种编程中常用的手段。在通常情况下断言就是将一个返回值总是需要为真的判断表达式放在语句中用于排除在设计的逻辑上不应该产生的情况。一个函数总需要输入在一定的范围内的参数那么程序员就可以对该参数使用断言以迫使在该参数发生异常的时候程序退出从而避免程序陷入逻辑的混乱。从一些意义上讲断言并不是正常程序所必需的不过对于程序调试来说通常断言能够帮助程序开发者快速定位那些违反了某些前提条件的程序错误。如果我们要在C程序中使用断言需要在程序中包含头文件cassert或assert.h头文件中为我们提供了 assert 宏用于在运行时进行断言。举例说明下面的代码将创建一个数组但是如果数组的size小于等于0这个数组将无法被创建那么用assert捕捉中断程序。#include iostream #include cassert using namespace std; char* createArray(int size) { //创建一个指定size大小的char类型数组 assert(size 0); //通过断言判断数组大小是否大于0 必须大于0否则程序中断 char* array new char[size]; return array; } int main() { char* buf createArray(10); system(pause); return 0; }在程序的第6行使用了断言assert(expression)这是一个宏它的参数是一个表达式这个表达式通常返回一个布尔类型的值并且要求表达式必须为 true 程序才能继续向下执行否则会直接中断。如果createArray参数size0, 程序正常运行直到结束。如果createArray参数size0, 程序会中断。但是上面的断言必须在执行之后才能知道在编译之后也不会知道这个断言的结果。这意味着不运行程序我们将无法得知某些条件是否是成立的。比如操作系统的类型是win还是linux。静态断言c11提供了静态断言静态断言static_assert(断言表达式警告信息字符串)。所谓静态就是在编译时就能够进行检查的断言而不是只有在执行之后才得知结果使用时不需要引用头文件。静态断言的另一个好处是可以自定义违反断言时的错误提示信息。静态断言使用起来非常简单它接收两个参数参数1断言表达式这个表达式通常需要返回一个 bool值参数2警告信息字符串它通常就是一段字符串在违反断言表达式为false时提示该信息。这样就可以在执行之前就知道操作系统是32位的win还是64位的linux#include iostream using namespace std; int main() { //static_assert(断言的条件,断言的提示信息,) static_assert(sizeof(long) 8, 当前操作系统不是64位的); //在win中这行代码会报错但是在linux中不会。 cout Hello world endl; //用来看看是不是能执行之后的代码 return 0; }补充32位系统和64位系统的数据类型对比整型名称 16 位 Windows占用字节数[数据范围]32 位 Linux占用字节数[数据范围]64 位 Linux占用字节数[数据范围]intsigned 、signed int4字节[-231231-1]INT_MIN-2147483648INT_MAX21474836474字节[-231231-1]INT_MIN-2147483648INT_MAX21474836474字节[-231231-1]INT_MIN-2147483648INT_MAX2147483647unsigned intunsigned4字节[0232-1]UINT_MAX42949672954字节[0232-1]UINT_MAX42949672954字节[0232-1]UINT_MAX4294967295shortshort int、signed short 、signed short int2字节[-215215-1]SHRT_MIN-32768SHRT_MAX327672字节[-215215-1]SHRT_MIN-32768SHRT_MAX327672字节[-215215-1]SHRT_MIN-32768SHRT_MAX32767unsigned shortunsigned short int2字节[0216-1]USHRT_MAX655352字节[0216-1]USHRT_MAX655352字节[0216-1]USHRT_MAX65535longlong int、signed long、signed long int4字节[-231231-1]LONG_MIN-2147483648LONG_MAX21474836474字节[-231231-1]LONG_MIN-2147483648LONG_MAX21474836478字节[-263263-1]LONG_MIN-9223372036854775808LONG_MAX9223372036854775807unsigned longunsigned long int4字节[0232-1]ULONG_MAX42949672954字节[0232-1]ULONG_MAX42949672958字节[0264-1]ULONG_MAX18446744073709551615long longlong long int、signed long long、signed long long int8字节[-263263-1]LLONG_MIN-9223372036854775808LLONG_MAX92233720368547758078字节[-263263-1]LLONG_MIN-9223372036854775808LLONG_MAX92233720368547758078字节[-263263-1]LLONG_MIN-9223372036854775808LLONG_MAX9223372036854775807unsigned long longunsigned long long int8字节[0264-1]ULLONG_MAX184467440737095516158字节[0264-1]ULLONG_MAX184467440737095516158字节[0264-1]ULLONG_MAX18446744073709551615*指针变量4字节4字节8字节