天天看點

C++> static_assert靜态斷言與assert動态斷言

static_assert

static_assert靜态斷言,是C++關鍵字,作用是讓編譯器在編譯期對常量表達時進行斷言。如果通過,就不報錯;如果不通過,就報錯。

用法:

```c++

static_assert(常量表達式, 錯誤提示資訊);

常量表達式的值為true或者false,或者可以轉化為true/false。
如果斷言不通過,程式編譯也不會通過。

### assert
assert動态斷言,從C繼承過來的宏定義,頭檔案assert.h。
從下面源碼可以看到,assert是把表達式通過static_cast<bool>轉換成bool類型,進而實作斷言。

```C++
// # if defined __cplusplus

#  define assert(expr)                          \
     (static_cast <bool> (expr)                     \
      ? void (0)                            \
      : __assert_fail (#expr, __FILE__, __LINE__, __ASSERT_FUNCTION))           

assert不管斷言是否通過,都不會影響編譯。

static_cast與assert主要差別

**2. 是否影響程式運作效率**
static_assert: 所包含的代碼不會生成目标代碼,不會影響程式性能;
assert: 會影響程式性能,常用于調試階段,正式釋放軟體時通常關閉assert功能;
參考[c++靜态斷言(static_assert)](https://zhuanlan.zhihu.com/p/79743589)