Cpp / #error、static_assert、assert 區別
阿新 • • 發佈:2021-05-21
一、#error
執行期間是預編譯階段,目的是配合 #ifdef / #ifndef 參與預編譯的條件檢查,顯示一段錯誤資訊。
二、static_assert
static_assert(bool flag, char *msg);
- 編譯期斷言,程式在編譯的過程中執行。
- 若 flag 為真,什麼也不做。
- 若 flag 為假,產生一條編譯錯誤,輸出錯誤資訊 msg,錯誤位置為當前行號。
static_assert 可以放在程式碼中任何位置,可以增加編譯期對程式的控制,準確定位出錯的可能。
三、assert
assert(bool flag);
- assert 是從 C 語言中繼承過來的的斷言方式,執行期下的斷言
- 若 flag 為真,什麼也不做。
- 若 flag 為假,終止程式。
注意 assert 預設無論在 Debug 還是 Release 下均是有效的,如果想要只在 Debug 下生效,需要在
#include <cassert>
之前增加巨集
#define NDEBUG
static_assert(1 == 2, "1 not equal 2."); #include <iostream> #define NDEBUG #include <cassert> #ifdef NDEBUG #error "define NDDEBUG" #endif int main() { int i = 0; assert(i == 2); return 0; }
編譯結果:
test.cc:11:2: error: #error "define NDDEBUG"
#error "define NDDEBUG"
^~~~~
test.cc:1:1: error: static assertion failed: 1 not equal 2.
static_assert(1 == 2, "1 not equal 2.");
^~~~~~~~~~~~~
因為 #error 發生在預編譯階段,static_assert 發生在編譯階段,所以 #error 資訊先顯示,static_assert 後顯示。
(SAW:Game Over!)