Namespaces
Variants

Static assertion (since C11)

From cppreference.net

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - HTMLタグ、属性、クラス名はすべて保持されています - ` `内のテキストはC++関連の用語(Syntax, Explanation, Keywords, Example, References, See also)であるため、翻訳せずに保持しています - 番号や構造は完全に保持されています - フォーマットとインデントは元のまま維持されています

構文

_Static_assert ( expression , message ) (C11以降) (C23で非推奨)
static_assert ( expression , message ) (C23以降)
_Static_assert ( expression ) (C23以降) (C23で非推奨)
static_assert ( expression ) (C23以降)
expression - 任意の integer constant expression
message - 任意の string literal

このキーワードは利便性のためのマクロ static_assert としても利用可能であり、 <assert.h> ヘッダーで提供されています。

(C23まで)

static_assert _Static_assert は同じ効果を持ちます。 _Static_assert は互換性のために保持されている非推奨のスペルです。

実装は static_assert および/または _Static_assert を定義済みマクロとして定義することもでき、 static_assert はもはや <assert.h> では提供されません。

(C23以降)

説明

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

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

キーワード

_Static_assert , static_assert

#include <assert.h> // C23以降は不要
int main(void)
{
    // 数学が機能するかテスト、C23:
    static_assert((2 + 2) % 3 == 1, "Whoa dude, you knew!");
    // C23以前の代替案:
    _Static_assert(2 + 2 * 2 == 6, "Lucky guess!?");
    // これはコンパイル時にエラーを生成します
    // static_assert(sizeof(int) < sizeof(char), "Unmet condition!");
    constexpr int _42 = 2 * 3 * 2 * 3 + 2 * 3;
    static_assert(_42 == 42); // メッセージ文字列は省略可能
    // const int _13 = 13;
    // コンパイル時エラー - 整数定数式ではありません:
    // static_assert(_13 == 13);
}

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 6.7.11 静的表明 (p: 未定)
  • C17規格 (ISO/IEC 9899:2018):
  • 6.7.10 静的表明 (p: 105)
  • 7.2 診断 <assert.h> (p: 135)
  • C11 standard (ISO/IEC 9899:2011):
  • 6.7.10 Static assertions (p: 145)
  • 7.2 Diagnostics <assert.h> (p: 186-187)

関連項目

ユーザー指定の条件が true でない場合、プログラムを異常終了させる。リリースビルドでは無効化される可能性がある
(関数マクロ)
C++ documentation for static_assert declaration