靜態斷言

Version >= C11

靜態斷言用於在編譯程式碼時檢查條件是否為真。如果不是,則編譯器需要發出錯誤訊息並停止編譯過程。

靜態斷言是在編譯時檢查的,而不是執行時。條件必須是常量表示式,如果為 false 則會導致編譯器錯誤。第一個引數,即檢查的條件,必須是常量表示式,第二個引數是字串文字。

與 assert 不同,_Static_assert 是一個關鍵字。方便巨集 static_assert<assert.h> 中定義。

#include <assert.h>

enum {N = 5};
_Static_assert(N == 5, "N does not equal 5");
static_assert(N > 10, "N is not greater than 10");  /* compiler error */

Version = C99

在 C11 之前,沒有直接支援靜態斷言。但是,在 C99 中,可以使用巨集來模擬靜態斷言,如果編譯時條件為 false,則會觸發編譯失敗。與 _Static_assert 不同,第二個引數必須是正確的令牌名稱,以便可以使用它建立變數名稱。如果斷言失敗,則在編譯器錯誤中看到變數名稱,因為該變數在語法錯誤的陣列宣告中使用。

#define STATIC_MSG(msg, l) STATIC_MSG2(msg, l)
#define STATIC_MSG2(msg,l) on_line_##l##__##msg
#define STATIC_ASSERT(x, msg) extern char STATIC_MSG(msg, __LINE__) [(x)?1:-1]
 
enum { N = 5 };
STATIC_ASSERT(N == 5, N_must_equal_5);
STATIC_ASSERT(N > 5, N_must_be_greater_than_5); /* compile error */

在 C99 之前,你無法在塊中的任意位置宣告變數,因此你必須非常謹慎地使用此巨集,確保它僅出現在變數宣告有效的位置。