次の方法で共有


_Static_assert キーワードと static_assert マクロ (C11)

コンパイル時にアサーションをテストします。 指定された定数式が false の場合、コンパイラには、指定されたメッセージが表示され、コンパイルはエラー C2338 で失敗します。それ以外の場合、影響はありません。 C11 での新機能です。

_Static_assert は、C11 で導入されたキーワードです。 static_assert は、C11 で導入されたマクロであり、 _Static_assert キーワードにマップされます。

構文

_Static_assert(constant-expression, string-literal);
static_assert(constant-expression, string-literal);

パラメーター

constant-expression
コンパイル時に評価できる整数定数式。 式がゼロ (false) の場合、 string-literal パラメーターが表示され、コンパイルはエラーで失敗します。 条件がゼロ以外 (true) の場合、影響はありません。

string-literal
constant-expression が 0 (false) と評価された場合に表示されるメッセージ。 このメッセージは、コンパイラの基本文字セットを使用して作成される必要があります。 文字をマルチバイト文字またはワイド文字にすることはできません。

解説

コンパイル時は、ソフトウェアのアサーションが _Static_assert キーワードと static_assert マクロの両方によってテストされます。 これらは、グローバル スコープまたは関数スコープで使用できます。

これに対し、実行時は、assert マクロ、および _assert_wassert 関数によってソフトウェアのアサーションがテストされ、ランタイム コストが発生します。

Microsoft 固有の動作

C では、<assert.h> を含まない場合、 static_assert は、Microsoft コンパイラによって、 _Static_assert にマップするキーワードとして扱われます。 同じコードが C と C++ の両方で動作するため、 static_assert を使用することをお勧めします。

コンパイル時アサートの例

次の例では、 static_assert_Static_assert を使用して、列挙に含まれる要素の数と、整数が 32 ビット幅であることを確認しています。

// requires /std:c11 or higher
#include <assert.h>

enum Items
{
    A,
    B,
    C,
    LENGTH
};

int main()
{
    // _Static_assert is a C11 keyword
    _Static_assert(LENGTH == 3, "Expected Items enum to have three elements");

    // Preferred: static_assert maps to _Static_assert and is compatible with C++
    static_assert(sizeof(int) == 4, "Expecting 32 bit integers"); 

    return 0;
}

必要条件

マクロ 必須ヘッダー
static_assert <assert.h>

/std:c11 を使ってコンパイルします。

Windows SDK バージョン 10.0.20348.0 (バージョン 2104) 以降。 C11 および C17 開発用の Windows SDK のインストールについては、「Visual Studio に C11 および C17 サポートをインストールする」を参照してください。

関連項目

_STATIC_ASSERT マクロ
assert マクロと _assert および _wassert 関数/std (言語標準バージョンの指定)