在c++11之前就已經有了斷言,但是不是靜態斷言。
斷言
斷言是一種編程中常用的手段。在通常情況下,斷言就是將一個返回值總是需要為真的判斷表達式放在語句中,用於排除在設計的邏輯上不應該產生的情況。
一個函數總需要輸入在一定的範圍內的參數,那麼程序員就可以對該參數使用斷言,以迫使在該參數發生異常的時候程序退出,從而避免程序陷入邏輯的混亂。
從一些意義上講,斷言並不是正常程序所必需的,不過對於程序調試來説,通常斷言能夠幫助程序開發者快速定位那些違反了某些前提條件的程序錯誤。
如果我們要在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參數size>0 , 程序正常運行直到結束。
如果createArray參數size<=0 , 程序會中斷。
但是上面的斷言必須在執行之後才能知道,在編譯之後也不會知道這個斷言的結果。這意味着不運行程序我們將無法得知某些條件是否是成立的。比如操作系統的類型,是win還是linux。
靜態斷言
c++11提供了靜態斷言
靜態斷言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)佔用字節數
[數據範圍] |
|---|---|---|---|
| int(signed 、signed int) | 4字節
[-231,231-1] INT_MIN=-2147483648 INT_MAX=2147483647 |
4字節
[-231,231-1] INT_MIN=-2147483648 INT_MAX=2147483647 |
4字節
[-231,231-1] INT_MIN=-2147483648 INT_MAX=2147483647 |
| unsigned int(unsigned) | 4字節
[0,232-1] UINT_MAX=4294967295 |
4字節
[0,232-1] UINT_MAX=4294967295 |
4字節
[0,232-1] UINT_MAX=4294967295 |
| short(short int、signed short 、signed short int) | 2字節
[-215,215-1] SHRT_MIN=-32768 SHRT_MAX=32767 |
2字節
[-215,215-1] SHRT_MIN=-32768 SHRT_MAX=32767 |
2字節
[-215,215-1] SHRT_MIN=-32768 SHRT_MAX=32767 |
| unsigned short(unsigned short int) | 2字節
[0,216-1] USHRT_MAX=65535 |
2字節
[0,216-1] USHRT_MAX=65535 |
2字節
[0,216-1] USHRT_MAX=65535 |
| long(long int、signed long、signed long int) | 4字節
[-231,231-1] LONG_MIN=-2147483648 LONG_MAX=2147483647 |
4字節
[-231,231-1] LONG_MIN=-2147483648 LONG_MAX=2147483647 |
8字節
[-263,263-1] LONG_MIN=-9223372036854775808 LONG_MAX=9223372036854775807 |
| unsigned long(unsigned long int) | 4字節
[0,232-1] ULONG_MAX=4294967295 |
4字節
[0,232-1] ULONG_MAX=4294967295 |
8字節
[0,264-1] ULONG_MAX=18446744073709551615 |
| long long(long long int、signed long long、signed long long int) | 8字節
[-263,263-1] LLONG_MIN=-9223372036854775808 LLONG_MAX=9223372036854775807 |
8字節
[-263,263-1] LLONG_MIN=-9223372036854775808 LLONG_MAX=9223372036854775807 |
8字節
[-263,263-1] LLONG_MIN=-9223372036854775808 LLONG_MAX=9223372036854775807 |
| unsigned long long(unsigned long long int) | 8字節
[0,264-1] ULLONG_MAX=18446744073709551615 |
8字節
[0,264-1] ULLONG_MAX=18446744073709551615 |
8字節
[0,264-1] ULLONG_MAX=18446744073709551615 |
| *(指針變量) | 4字節 | 4字節 | 8字節 |