디버깅으로 쓰이는 assert
2019. 10. 30. 09:24ㆍPL/C++
디버깅모드로 동작시킬 때 사용자가 아닌 컴퓨터에게 디버깅을 맡겨서 보다 편하게 할 수 있게 하는 함수다. 컴파일 단계가 아닌 런타임 단계에서 에러를 출력한다
assert(식)을 쓰게 되는데, 식이 거짓이라면 오류를 출력한다. 장점이 오류가 발생한 라인도 출력을 해준다
#include <cassert>
#include <iostream>
using namespace std;
int main(void) {
assert(false);
return 0;
}
단, Release 모드이고 전처리기 명령에 NDEBUG; 명령이 추가되면 assert 실행이 되지 않는다
주로 API를 작성할 때, 디버깅 도구로 많이 사용된다. 예를 들어 사용되지 않는 메모리를 읽으려고 할 때 오류가 발생한다
#include <array>
#include <cassert>
#include <iostream>
using namespace std;
void print_array(const array<int, 5> & arr, int idx) {
assert(idx >= 0);
assert(idx < arr.size());
cout << arr[idx] << '\n';
}
int main(void) {
array<int, 5> arr = { 1, 2, 3, 4, 5 };
print_array(arr, 5);
return 0;
}
런타임이 아닌 컴파일 단계에서도 에러를 잡을 수 있다. 단 assert가 아닌 static_assert를 출력해야만 한다. 또한 두번째 인자에 오류 발생 시 출력 문자열을 넣을 수 있다
#include <array>
#include <cassert>
#include <iostream>
using namespace std;
int main(void) {
const int n = 5;
static_assert(n == 5, "n should be same '5'"); // 컴파일 오류 X
int m = 6;
static_assert(m == 6, "n should be same '6'"); // m은 런타임 단계에서 값이 확정되기 때문에 컴파일 에러 출력
return 0;
}
'PL > C++' 카테고리의 다른 글
cin으로 방어적 프로그래밍 (0) | 2019.10.31 |
---|---|
std::array와 std::vector 차이 (0) | 2019.10.30 |
char *과 const char * (0) | 2019.10.25 |
constexpr (0) | 2019.10.23 |
__cplusplus 매크로 의미 (0) | 2019.10.19 |