現代 C (C11/C17/C23)

_Static_assert / static_assert(靜態斷言)

/ STAT-ik a-SERT /

一般的 assert() 在程式執行時檢查條件,若為假就中止。但有些事實應該在程式根本還沒執行「之前」就檢查——例如 int 至少 4 位元組,或某個結構的大小符合你協定的預期。靜態斷言是編譯器在編譯期執行的檢查:若條件為假,編譯就帶著你的訊息失敗;若為真,則完全不產生任何程式碼。

寫法是 static_assert(常數運算式, "訊息")(關鍵字在 C11 是 _Static_assert,較友善的名字 static_assert 透過 <assert.h> 提供,C23 把它變成真正的關鍵字且訊息可省略)。條件必須是編譯器能求值的常數運算式,例如 sizeof(int) >= 4 或 (FLAGS & 0x3) == 0。因為在編譯期求值,所以沒有任何執行期成本,並且建構失敗會在任何使用者執行程式之前就攔下問題。

它作為「假設的護欄」很重要:若假設出錯就會造成無聲的損毀,例如二進位格式的結構佈局、表格大小要符合列舉數量、對齊需求、以及平台字組大小。要記住的提醒:運算式必須是「常數」運算式——你不能對執行期的值或一般函式呼叫的結果做 static_assert;執行期的檢查仍要用 assert() 或你自己的錯誤處理。

#include <assert.h> static_assert(sizeof(int) >= 4, "this code assumes 32-bit int"); struct packet { unsigned char a, b; unsigned short c; }; static_assert(sizeof(struct packet) == 4, "packet must be 4 bytes");

若任一事實在目標平台上為假,建構就帶著訊息停止——壞掉的二進位檔永遠不會出貨。

它只對編譯期已知的常數運算式有效;無法驗證執行期資料——那種情況仍需要 assert() 或明確的錯誤處理。

又稱
static assertioncompile-time assert編譯期斷言