관리 메뉴

기억을 위한 기록들

[C&CPP] assert/static_assert 관련 본문

C & CPP

[C&CPP] assert/static_assert 관련

에드윈H 2021. 4. 15. 14:44

네이버 영어사전

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를 넣게 된다면, 확인이 좀 더 용이해지지 않을까 싶다.