static_assert
컴파일 시 소프트웨어 어설션을 테스트합니다. 지정된 상수 식이 false
있으면 컴파일러가 지정된 메시지를 표시하고, 제공된 경우 컴파일이 오류 C2338로 실패하고, 그렇지 않으면 선언이 적용되지 않습니다.
구문
static_assert( constant-expression, string-literal );
static_assert( constant-expression ); // C++17 (Visual Studio 2017 and later)
매개 변수
constant-expression
부울로 변환할 수 있는 정수 계열 상수 식입니다. 계산된 식이 0(false) 이면 문자열 리터럴 매개 변수가 표시되고 컴파일에 오류가 발생합니다. 식이 0이 아닌 경우(true) static_assert
선언은 적용되지 않습니다.
string-literal
상수 식 매개 변수가 0이면 표시되는 메시지입니다. 메시지는 컴파일러의 기본 문자 집합에 있는 문자 문자열입니다. 즉, 멀티바이트 또는 와이드 문자가 아닙니다.
설명
선언의 static_assert
상수 식 매개 변수는 소프트웨어 어설션을 나타냅니다. 소프트웨어 어설션은 프로그램의 특정 지점에서 true가 될 조건을 지정합니다. 조건이 true이면 선언에 static_assert
영향을 주지 않습니다. 조건이 false이면 어설션이 실패하고, 컴파일러가 메시지를 문자열 리터럴 매개 변수로 표시하고, 오류와 함께 컴파일이 실패합니다. Visual Studio 2017 이상에서는 문자열 리터럴 매개 변수가 선택 사항입니다.
이 선언은 static_assert
컴파일 시간에 소프트웨어 어설션을 테스트합니다. 반면, 어설션 매크로 및 _assert 및 _wassert 함수는 런타임에 소프트웨어 어설션을 테스트하고 공간 또는 시간에 런타임 비용이 발생합니다. 템플릿 인수를 static_assert
상수 식 매개 변수에 포함할 수 있으므로 이 선언은 템플릿을 디버깅하는 데 특히 유용합니다.
컴파일러는 선언이 static_assert
발견될 때 구문 오류에 대한 선언을 검사합니다. 컴파일러는 템플릿 매개 변수에 의존하지 않는 경우 상수 식 매개 변수를 즉시 평가합니다. 그렇지 않으면 템플릿이 인스턴스화될 때 컴파일러가 상수 식 매개 변수를 평가합니다. 그 결과, 컴파일러는 선언이 발생할 때 진단 메시지를 한 번 내보내고 템플릿이 인스턴스화될 때 다시 한 번 메시지를 내보낼 수 있습니다.
네임스페이 static_assert
스, 클래스 또는 블록 범위에서 키워드(keyword) 사용할 수 있습니다. (다음 static_assert
항목 키워드(keyword) 네임스페이스 범위에서 사용할 수 있으므로 프로그램에 새 이름을 도입하지 않더라도 기술적으로 선언입니다.)
네임스페이스 범위에 대한 static_assert
설명
다음 예제에서는 선언에 static_assert
네임스페이스 범위가 있습니다. 컴파일러가 void *
형식의 크기를 알고 있기 때문에 식이 즉시 계산됩니다.
예: static_assert
네임스페이스 범위 사용
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");
클래스 범위에 대한 static_assert
설명
다음 예제에서 선언에는 static_assert
클래스 범위가 있습니다. static_assert
템플릿 매개 변수가 POD(일반 이전 데이터) 형식인지 확인합니다. 컴파일러는 선언될 때 선언을 static_assert
검사하지만 클래스 템플릿이 인스턴스화main()
될 때까지 상수 식 매개 변수를 basic_string
평가하지 않습니다.
예: static_assert
클래스 범위 사용
#include <type_traits>
#include <iosfwd>
namespace std {
template <class CharT, class Traits = std::char_traits<CharT> >
class basic_string {
static_assert(std::is_pod<CharT>::value,
"Template argument CharT must be a POD type in class template basic_string");
// ...
};
}
struct NonPOD {
NonPOD(const NonPOD &) {}
virtual ~NonPOD() {}
};
int main()
{
std::basic_string<char> bs;
}
블록 범위에 대한 static_assert
설명
다음 예제에서는 선언에 static_assert
블록 범위가 있습니다. VMPage static_assert
구조체의 크기가 시스템의 가상 메모리 페이지와 같은지 확인합니다.
예: static_assert
블록 범위
#include <sys/param.h> // defines PAGESIZE
class VMMClient {
public:
struct VMPage { // ...
};
int check_pagesize() {
static_assert(sizeof(VMPage) == PAGESIZE,
"Struct VMPage must be the same size as a system virtual memory page.");
// ...
}
// ...
};
참고 항목
어설션 및 사용자 제공 메시지(C++)
#error 지시문(C/C++)
assert Macro, _assert, _wassert
템플릿
ASCII 문자 집합
선언 및 정의
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기