assert 라이브러리

디버깅을 할 때 유용하게 사용할 수 있는 assert라이브러리에 대해 설명해주겠다.

사용법은 간단하다. assert.h를 include하고, 반드시 만족해야 하는 조건assert()로 설정해주면 된다.

예제를 보자, 사용자에게 정수 두개를 입력받고 나눈 값을 출력하는 예제이다. 이때 나누기를 수행하는 divide()함수에 assert()를 이용할 수 있다.

int main()
{
	int a, b;
	int f = scanf("%d%d", &a, &b);

	printf("a / b = %d", divide(a,b));

	return 0;
}
int divide(int a, int b)
{
	assert(b != 0);

	/*if (b != 0)
	{
		printf("cannot divied\\n");
		exit(1);
	}*/

	return a / b;
}

나눗셈의 고려할 요소 중 하나는 0으로 나누기임. 이때 주석처리한 것 처럼 구현할 수도 있지만, assert()를 이용하면 더 간략하게 구현할 수 있다. 그리고 assert()를 이용하면 의미전달이 더 뚜렷함.

디버그모드로 진입했을때 assert()가 작동함

Untitled

이렇게 몇번째 줄의 assert에서 fail이 나왔는지 알려주며 실행이 멈춘다.

릴리즈 모드에서 실행하면 assert()가 무시된다. 릴리즈 모드는 개발이 다 끝났고 배포를 하기 위한 모드, 즉 디버그가 다 끝났다는 의미로 간주하기 때문에 디버그를 위한 함수들은 빌드시 포함되지 않는다.

디버그시 있어서는 안되는 일에는 assert를 걸어놓는 습관이 좋다. 이를 통해 명백한 잔실수를 줄이면서 디버그의 효율을 늘릴 수 있음.

다음으로 static assert라는게 있다.

이건 컴파일타임에서 잡아주는 assert이다. 즉 컴파일타임시 있을 수 없는 조건들을 런타임 이전에 잡아주는 조건…

비주얼 스튜디오 C에서는 static assert를 사용못하지만, C++에서는 사용가능.. 거기서 배우자.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ