名前空間
変種
操作

静的アサート (C11以降)

From cppreference.com
< c‎ | language

目次

[編集] 構文

_Static_assert ( expression , message ) (C11以降)(C23で非推奨)
static_assert ( expression , message ) (C23以降)
_Static_assert ( expression ) (C23以降)(C23で非推奨)
static_assert ( expression ) (C23以降)
- 任意の 整数定数式
message - 任意の 文字列リテラル

このキーワードは、ヘッダー <assert.h> で利用可能な便利なマクロ static_assert としても利用できます。

(C23まで)

static_assert_Static_assert はどちらも同じ効果があります。_Static_assert は互換性のために保持されている、非推奨のスペルです。

実装によっては、static_assert および/または _Static_assert を事前定義マクロとして定義する場合があり、static_assert<assert.h> からは提供されなくなりました。

(C23以降)

[編集] 説明

定数式はコンパイル時に評価され、ゼロと比較されます。ゼロと比較して等しい場合、コンパイル時エラーが発生し、コンパイラは エラーメッセージの一部として message を表示しなければなりません (ただし、基本文字セットに含まれない文字は表示されない場合があります)(C23まで)(提供されている場合) エラーメッセージの一部として message を表示すべきです(C23以降)

それ以外の場合、つまり expression がゼロと等しくない場合、何も起こらず、コードは生成されません。

[編集] キーワード

_Static_assertstatic_assert

[編集]

#include <assert.h> // no longer needed since C23
 
int main(void)
{
    // Test if math works, C23:
    static_assert((2 + 2) % 3 == 1, "Whoa dude, you knew!");
    // Pre-C23 alternative:
    _Static_assert(2 + 2 * 2 == 6, "Lucky guess!?");
 
    // This will produce an error at compile time.
    // static_assert(sizeof(int) < sizeof(char), "Unmet condition!");
 
    constexpr int _42 = 2 * 3 * 2 * 3 + 2 * 3;
    static_assert(_42 == 42); // the message string can be omitted.
 
    // const int _13 = 13;
    // Compile time error - not an integer constant expression:
    // static_assert(_13 == 13);
}

[編集] 参考文献

  • C23標準 (ISO/IEC 9899:2024)
  • 6.7.11 静的アサート (p: TBD)
  • C17標準 (ISO/IEC 9899:2018)
  • 6.7.10 静的アサート (p: 105)
  • 7.2 診断 <assert.h> (p: 135)
  • C11標準 (ISO/IEC 9899:2011)
  • 6.7.10 静的アサート (p: 145)
  • 7.2 診断 <assert.h> (p: 186-187)

[編集] 関連項目

ユーザー指定の条件が true でない場合にプログラムを異常終了させる。リリースビルドでは無効化されることがある
(関数マクロ) [編集]
C++ のドキュメント (static_assert 宣言について)
English 日本語 中文(简体) 中文(繁體)