디버깅으로 쓰이는 assert

2019. 10. 30. 09:24PL/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