Namespaces
Variants

Static assertion (since C11)

From cppreference.net

목차

구문

_Static_assert ( expression , message ) (C11부터) (C23에서 사용 중단됨)
static_assert ( expression , message ) (C23부터)
_Static_assert ( expression ) (C23부터) (C23에서 사용 중단됨)
static_assert ( expression ) (C23부터)
expression - 임의의 정수 상수 표현식
message - 임의의 문자열 리터럴

이 키워드는 편의를 위한 매크로 static_assert 로도 사용 가능하며, <assert.h> 헤더에서 제공됩니다.

(C23 이전)

static_assert _Static_assert 는 동일한 효과를 가집니다. _Static_assert 는 호환성을 위해 유지되는 사용 중단된(deprecated) 표기법입니다.

구현체는 static_assert 와/또는 _Static_assert 를 미리 정의된 매크로로 정의할 수도 있으며, static_assert 는 더 이상 <assert.h> 에 의해 제공되지 않습니다.

(C23 이후)

설명

상수 표현식은 컴파일 타임에 평가되어 0과 비교됩니다. 0과 같으면 컴파일 타임 오류가 발생하며 컴파일러는 반드시 message 를 오류 메시지의 일부로 표시해야 합니다 (단, 기본 문자 집합 에 없는 문자는 표시하지 않아도 됨) (C23까지) 오류 메시지의 일부로 message (제공된 경우)를 표시해야 합니다 (C23부터) .

그렇지 않으면 expression 이 0이 아닌 경우, 아무 일도 발생하지 않습니다; 코드가 생성되지 않습니다.

키워드

_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 Static assertions (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 Static assertions (p: 145)
  • 7.2 Diagnostics <assert.h> (p: 186-187)

참고 항목

사용자가 지정한 조건이 true 가 아닐 경우 프로그램을 중단합니다. 릴리스 빌드에서는 비활성화될 수 있음
(함수 매크로)
C++ documentation for static_assert declaration