일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- dataasset
- 약참조
- 선택정렬
- unorder_map
- 알고리즘
- UE4 커스텀로그
- 프로그래머스
- 애셋로드
- map
- UML관련
- 언리얼엔진구조체
- stl
- enumasByue
- UELOG
- UE_LOG
- 람다사용정렬
- 정렬
- 언리얼가비지컬렉터
- 정렬알고리즘
- C++최적화
- 스마트포인터
- 크리티컬섹션
- 자료구조
- 데이터애셋
- BFS
- 강참조
- moreeffectiveC++
- 델리게이트
- C++
- 람다
- Today
- Total
기억을 위한 기록들
[C&CPP] assert/static_assert 관련 본문
assert는 확고히 하다/주장하다 등의 뜻으로 디버깅 모드에서 개발자가 프로그램을 개발하면서 생기는 오류를 잡아주기 위한 용도로 에러 검출용 함수이다.
예를 보면
#include <iostream>
#include <cassert>
using namespace std;
int main()
{
int a = 5;
assert(a == 5); //5면 통과
cout << a << endl;
return 0;
}
위의 코드는 assert함수 안에서 a==5라면 코드가 문제없이 진행되고,
a의 변수를 11로 초기화해주고 다시 실행시켜보면
#include <iostream>
#include <cassert>
using namespace std;
int main()
{
int a = 11;
assert(a == 5); //5면 통과
cout << a << endl;
return 0;
}
아래와 같이 문제를 뱉어낸다.
중요한건 assert 함수는 Debug 모드에서만 컴파일이 됨으로, 다른 코드에 영향을 주지 않는 내용을 넣어야 한다는 점이다.
또 하나는 static_assert이다.
static_assert의 특징으로는
- 컴파일중에 assert를 평가한다.- 컴파일러가 assert조건이 참이 아닌지를 안다.- 실패하면 컴파일러는 컴파일 에러를 띄어준다.
예로 보면
#include <iostream>
#include <cassert>
using namespace std;
int main()
{
int num[1] = { 10 };
static_assert(sizeof(num) == 4,"num arr size is not 4"); //배열 사이즈가 4라면 통과
cout << "배열 사이즈 : "<<sizeof(num) << endl;
return 0;
}
위 코드에서 num배열의 크기는 1로 10이라는 정수 한 개만 들어가 있다. int는 4바이트로 1개만 들어가 있으니
sizeof(num)은 4이기 때문에, 위 코드는 컴파일시 static_assert에 걸리지 않는다.
여기서 이제 num의 배열 크기를 2로 바꿔주면서, 새로운 정수 값 7을 추가해보자.
#include <iostream>
#include <cassert>
using namespace std;
int main()
{
int num[2] = { 10, 7 }; //7추가
static_assert(sizeof(num) == 4, "num arr size is not 4");
cout << "배열 사이즈 : " << sizeof(num) << endl;
return 0;
}
static_assert에선 여전히 num배열을 4크기로 검사하고 있기에 컴파일하게 되면,
안에 작성되어 있는 문구가 출력이 되는 것을 확인할 수 있다.
간단하게 두개를 알아보았는데 차이점이라고 한다면,
assert는 실행을 해야 문제가 있는지 없는지 확인이 가능하고
static_assert는 컴파일만 해도 문제가 있는지 없는지 알려준다.
그리고 static_assert는 내가 원하는 에러문구를 띄어줄수 있기에, 위 처럼 단순한 한줄이 아닌 수십줄의 assert를 넣게 된다면, 확인이 좀 더 용이해지지 않을까 싶다.
'C & CPP' 카테고리의 다른 글
[CPP] C++ 최적화에 관하여 (2-3) (0) | 2021.08.16 |
---|---|
[CPP] C++ 최적화에 관하여 (1-3) (0) | 2021.07.25 |
[CPP]반환 값 최적화(return value optimization)RVO란?/NRVO (3) | 2021.04.14 |
[C++] 정수 자료형의 범위/int8, int16, int32, int64.. (0) | 2021.04.02 |
lvalue와 rvalue /rvalue 참조와 이동생성자,이동대입연산자 사용 (0) | 2021.03.28 |