C++ assert와 static_assert


C++ assert와 static_assert


우리는 프로그램을 만들 때 디버깅 시간이 많이 걸리게 된다.

디버깅을 할때도 컴파일러 도움을 받는다면 디버깅이 더욱 더 쉽고, 시간이 적게 들 것이다.


사용법은 간단하다.

일단 assert()에 대해서 알아보자.

assert는 런타임(실행중)중에만 된다.


#include <iostream>
#include <cassert> // assert.h
using namespace std;

int main()
{
	assert(false);

	return 0;
}

먼저 이렇게 하고 assert가 어떻게 동작을 하는지 알아보자.



이렇게 7행에 오류가 있다고 런타임 에러(runtime error)가 뜬다.



디버깅 모드에서는 _DEBUG가 정의 되어있으면 assert가 동작을 하고



Release 모드에서는 NDEBUG가 정의되어 있기에 assert가 동작을 안한다.

그냥 무시가 되어버린다.


assert는 디버깅 모드에서만 작동되게끔 되어있다.


#include <iostream>
#include <cassert> // assert.h
using namespace std;

int main()
{
	int number = 4;
	
	assert(number == 5);

	return 0;
}

assert는 "number이 무조건 5 값이여야 된다!" 라고 말을 해주고 있는 것이다.


우리가 assert가 없으면 무조건 프로그래머에게 "number는 무조건 5여야 되요!" 일일이 말을 하고 다닐수도 없고 주석을 달아야 된다.

근데 주석을 못볼수도 있는 상황에서

assert를 이용하면 number이 5값이 아니면 런타임 에러가 발생 하게 된다.



9행에 오류가 났다고 알려주게 된다.


#include <iostream>
#include <cassert> // assert.h
#include <array>
using namespace std;

void printValue(const std::array<int, 5> &my_array, const int &ix)
{
	assert(ix >= 0);
	assert(ix <= my_array.size() - 1);
	cout << my_array[ix] << endl;
}

int main()
{
	std::array<int, 5> my_array{ 1,2,3,4,5 };

	printValue(my_array, 100);
	return 0;
}

printValue 함수를 api 함수라고 생각해보자.

보통 api 함수는 내용을 모르고 쓴다.


만약 17행에서 my_array 배열을 보내고 길이를 100을 보냈다면 출력이 제대로 동작을 하지 않을것이다.

그래서 8~9행을 보면 ix >= 0 이거나 ix <= my_array.size() -1 이면 런타임 에러와 몇번째 줄에 오류가 났는지 확인이 가능하다.

그래서 프로그래머가 몇 길이를 보내줘야하는지 알 수 있을것이다.


두번째로 static_assert는 컴파일 타임에 결정이 된다.

#include <iostream>
#include <cassert> // assert.h
using namespace std;

int main()
{
	const int x = 5;

	static_assert(x == 5, "x = 5");

	return 0;
}

컴파일 타임에 결정되기 때문에 int x는 항상 상수여야 된다.

static_assert(비교할 값(상수), "에러메세지");


이렇게 몇번째 행에 에러메세지를 출력할 수 있다.

댓글

Designed by JB FACTORY