1. 程式人生 > 其它 >Cpp / #error、static_assert、assert 區別

Cpp / #error、static_assert、assert 區別

一、#error

執行期間是預編譯階段,目的是配合 #ifdef / #ifndef 參與預編譯的條件檢查,顯示一段錯誤資訊。

二、static_assert

static_assert(bool flag, char *msg);
  1. 編譯期斷言,程式在編譯的過程中執行。
  2. 若 flag 為真,什麼也不做。
  3. 若 flag 為假,產生一條編譯錯誤,輸出錯誤資訊 msg,錯誤位置為當前行號。

static_assert 可以放在程式碼中任何位置,可以增加編譯期對程式的控制,準確定位出錯的可能。

三、assert

assert(bool flag);
  1. assert 是從 C 語言中繼承過來的的斷言方式,執行期下的斷言
  2. 若 flag 為真,什麼也不做。
  3. 若 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!)