[PR]

コンパイル時アサート

戻る

 マクロ c_assert() は定数式についてコンパイル時にマクロ assert() と同等の働きをするものです。
 マクロ c_assert() は定数式 expression が 偽 の場合にコンパイルエラーを発生させます。
 たとえば次のような前提条件を検査できます。

	// 明示的な符号指定がない型 char は signed char と仮定した
	c_assert( is_signed(char) );
	
	// 右シフトが算術シフトである処理系を仮定した
	c_assert( -1 == (-1 >> 1) );
	
	// 1 バイトが 8 ビットである処理系を仮定した
	c_assert( 8 == CHAR_BIT );
	
	// 型 int が 32 ビット以上であると仮定した
	c_assert( 32 <= (CHAR_BIT * sizeof(int)) );

 マクロ c_assert() は以下のようにして定義することができます。

	/* c_assert(expression) マクロの定義 */
	#ifdef NDEBUG
	#define c_assert( expression )
	#else // #ifdef NDEBUG
	#define c_assert( expression )  typedef char DUMMY_ARRAY_FOR_COMPILE_ASSERT[ ( expression ) ? 1 : -1 ]
	#endif // #ifdef NDEBUG

 マクロ c_assert() は、定数式 expression が 偽 である場合、DUMMY_ARRAY_FOR_COMPILE_ASSERT を要素数 -1 の配列型名として宣言します。
 しかし要素数 -1 は配列の要素数としては不当であり、コンパイラはコンパイルエラーを出力してコンパイルに失敗します。
 どのようなエラーメッセージが表示されるかはコンパイラによって異なります。

関連

assert マクロを使う
verify マクロを使う
dbgprintf マクロを使う


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
『新妻LOVELY×CATION』を応援しています!