マクロ
NDEBUG
#include <assert.h>では定義されません。
NDEBUGを定義すると、後述するassertマクロ関数を無効にすることができます。
Visual Studioでは、リリースモードの場合にプリデファインとして定義されます。
デバッグモードの場合は定義されません。
関数
assert
宣言
#ifdef NDEBUG
#define assert(expr) ((void)0)
#else
#define assert(expr) ((expr) ? (void)0 : __assert(#expr, __FILE__, __LINE__))
#endif
引数
expr : 条件式
機能
プリデファイン”NDEBUG”が定義されている(リリースモード)の場合、何もしません。
プリデファイン”NDEBUG”が定義されていない(デバッグモードの)場合、assertマクロ関数の引数に条件式を記述することで、プログラム実行中に条件式を診断してプログラムを停止することができます。
条件式が真(0以外)の場合は何もしません。偽(0)の場合は、プログラムの実行を停止して、assertマクロ関数の実行個所を表示します。
assertはデバッグ用途で使用します。
使用例
#include <assert.h>
int Func1(int a)
{
if(a == 0){
return 1;
}else{
assert(a == 1);
return 0;
}
}
引数aが1の場合は、assertの条件式が真(1)になるので素通りしますが、引数aが0でも1でもない場合、VisualStudioでは、下図のような診断メッセージが出力されます。
キーワード
static_assert
静的アサーション(static assertion)を行うためのキーワードです。
静的アサーションは、コンパイル時に特定の条件をチェックし、条件が真であることを保証します。
もし条件が偽である場合、コンパイルエラーが発生します。
※C11以降で導入されました。
定義:
static_assert(expression, message);
- expression
チェックする条件を表す定数式や型式です。
もしexpressionが偽である場合、コンパイルエラーが発生します。 - message
コンパイルエラーメッセージです。
エラーメッセージは、条件が偽である場合に表示されます。
使用例:
#include <stdio.h>
#include <assert.h>
#define SIZE 10
int main(void)
{
static_assert(SIZE == 10, "Size of the array must be 10");
int arr[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for(int i = 0; i < SIZE; i++) {
printf("%d ", arr[i]);
}
return 0;
}
このコードでは、SIZEが10であることをstatic_assertでチェックしています。
もしSIZEが10でない場合、コンパイルエラーが発生し、指定したエラーメッセージが表示されます。
SIZEが10でない場合のVisualStudioでのコンパイルメッセージ:
error C2338: Size of the array must be 10
static_assertを使用することで、コンパイル時に条件の正当性を検証することができます。
これにより、プログラムの安全性や互換性を向上させることができます。
また、アサーションの失敗時に明確なエラーメッセージを表示することで、デバッグやメンテナンスの効率も向上します。
コメント