_Static_assert 宣言 (C11)

注: IBM は、C11 の選択された機能 (C1X と呼ばれる) をその承認の前にサポートします。IBM は、この標準の機能の開発および実装を継続します。この言語レベルの実装は、IBM による標準の解釈に基づいています。 新しい C11 標準ライブラリーのサポートを含め、すべての C11 機能を IBM が実装し終えるまで、 リリースごとに実装が変更される可能性があります。IBM では、IBM による C11 機能の実装に関し、ソース、バイナリー、リスト作成などのコンパイラー・インターフェースにおいて、以前のリリースとの互換性を維持するための試みは特に行いません。
静的アサーションを宣言して、コンパイル時に一般的な使用エラーを検出および診断することができます。_Static_assert 宣言の形式は、以下のとおりです。
構文図を読む構文図をスキップする
_Static_assert 宣言の構文 

>>-_Static_assert--(--constant_expression--,--string_literal---->

>--)--;--------------------------------------------------------><

constant_expression は整数定数式でなければなりません。整数定数式の評価の結果が 0 になった場合、コンパイラーは、_Static_assert 宣言のソース・ロケーションと一緒にストリング・リテラル を含む重大エラーを出します。それ以外の場合は、_Static_assert 宣言は影響を 与えません。

静的アサーションの宣言は、新しい型もオブジェクトも宣言せず、実行時にサイズも時間コストも暗黙指定しません。

static_assert は、C の assert.h に定義されているマクロです。

静的アサーションを C 言語に追加すると、 以下のような利点があります。
  • ライブラリーがコンパイル時に一般的な使用エラーを検出できます。
  • C 標準ライブラリーのインプリメンテーションにより、一般的な使用エラーを検出および診断できるため、 ユーザビリティーが向上します。
静的アサーションを宣言すると、重要なプログラム・インバリアントをコンパイル時に検査できます。

例: _Static_assert 宣言

例 1: 次の例は、構造体の中での _Static_assert 宣言の使用法を示しています。
 #include <stddef.h>
 struct __attribute__((packed)) B{
    char a;
    int i;
 };
 
 struct A{
    struct B b;
    _Static_assert(offsetof(struct B,i)==1,"S not packed");
 };
例 2: 次の例では、static_assert を使用して宣言された静的アサーションがあるため、assert.h ヘッダー・ファイルをインクルードする必要があります。
 /* static_assert requires <assert.h> */
 #include <assert.h>
 static_assert(sizeof(long) >= 8, "64-bit not enabled.");
例 3: 次の例は、無効な定数式を指定した _Static_assert 宣言の使用について示しています。
 _Static_assert(1 / 0, "never shows up!");
このプログラムをコンパイルすると、コンパイラーは _Static_assert 宣言のストリング・リテラル を表示しません。その代わり、コンパイラーは、除数をゼロにできないことを示すエラー・メッセージを出します。