Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

게임 개발 메모장

[ C++ ] assert (단언하기) 함수 본문

언리얼 엔진/C++

[ C++ ] assert (단언하기) 함수

Dev_Moses 2023. 6. 1. 17:18

- 디버그 모드에서 디버깅시 어떤 이유 때문에 에러가 났는지를 알 수 있는 유용한 키워드다.

- #include <cassert> 를 해주어야 사용이 가능하다.

 

1. assert(조건) 

 

* 이 조건식이 false 라면 런타임 에러가 나도록 한다.

#include <cassert> 
using namespace std;

int main()
{
	int number = 5;
	assert(number == 4);
	return 0;
}


1) Release모드 에선 아무런 문제가 없는 코드.

 

2) 하지만, Debug모드에선 에러를 발생.

- assert(number == 4) : number 값이 4가 아닌 5이기 때문.
- 프로그래머가 직접 number값이 4가 맞는지 찍어보지 않더라도 number값이 4가 아니면 에러를 발생시켜주므로

  디버깅 시 편함.

 

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

int main()
{
    std::array<int, 5> TestArray{ 1, 2, 3, 4, 5 };
    printValue(TestArray, 100);
    return 0;
}

 

 

디버그 모드로 실행했을 때 i >= 0 조건과 i <= TestArray.size() - 1 조건에 위반되는 경우

런타임 에러를 발생시킨다.

 

Assertion failed: ix <= my_array.size() - 1, line 9

 

이런 식으로 정확히 어디에서 문제 발생했는지 찍어준다.

 

 

 2. static_assert

 

* static_assert(조건) : 이 조건식이 false 라면 컴파일 에러가 나도록 한다.

  바로 빨간 줄이 그어져 개발자가  바로 알 수 있도록 하고 조건은 컴파일 타임에 결정될 수 있는

  조건만 넣을 수 있다.

int x = 4;

assert(x == 4);        // 문제 없음
static_assert(x == 4); // 컴파일 오류 발생! 빨간 줄 그어짐

 

 

일반 변수 x에 4라는 값은 메모리가 실행 후 런타임시에 할당된다.

따라서 x == 4라는 조건식이 참인지는 컴파일 타임 때 결정되는 경우가 아니므로

그냥 assert에는 넣을 수 있지만 static_assert 조건 안에는 넣을 수 없다. 

컴파일 때 참인지 따질 수 있는 조건식이 아니기 때문.

const int x = 4;

assert(x == 4);        // 문제 없음
static_assert(x == 4); // 문제 없음

 

 

변수 x는 컴파일 때 이미 값이 4로 정해져 있는 const변수이기 때문에 

이렇게 static_assert의 조건식으로 사용이 가능하다.

const int x = 10;

assert(x == 4);  
static_assert(x == 4, "x should be 4"); // 컴파일 오류 발생! 빨간 줄 그어짐

 

static_assert는 실행시 “x should be 4” 이렇게 에러 메세지를 띄우게 할 수 있다. 

조건식 (x == 4)는 false이므로 컴파일 오류가 발생한다.