_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 宣言のストリング・リテラル を表示しません。その代わり、コンパイラーは、除数をゼロにできないことを示すエラー・メッセージを出します。