靜態斷言
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 之前,你無法在塊中的任意位置宣告變數,因此你必須非常謹慎地使用此巨集,確保它僅出現在變數宣告有效的位置。