[C++] assert / static_assert

Date:     Updated:

카테고리:

태그:

이 글은 C++의 assert와 static_assert를 공부하고 정리한 글입니다

assert

  • 실행 중에 가정(어서션, assertion)이 맞는지 평가
  • 오직 디버그 빌드에서만 작동
  • 실패한 assert를 보려면 반드시 프로그램을 실행해야 함
    • 모든 코드 경로가 실행되었다고 어떻게 장담할까?
    • 일부 어서션은 프로그램을 실행하기도 전에 알 수 있음
  • 그래서 가능한 많은 곳에서 사용하자
    • 디버그 과정에서 미리 버그를 잡는 좋은 습관이 됨

    코드 예제

    #include <cassert>
    const Student* Class::GetStudentInfo(const char* name)
    {
        assert(name != NULL);     // 조건이 false면 실행을 멈춤
    }
    

static_assert

  • 컴파일 중에 어서션 평가
  • 컴파일러가 aasert 조건이 참인지 아닌지 앎
  • 실패하면 컴파일러는 컴파일 에러를 뱉음
  • 많은 경우에 유용함

    코드 예제

    // 예시 1 : 구조체의 크기
    static_assert(sizeof(Student) == 60, "Student structure size mismatch");
    
    // 예시 2 : Version 확인하기
    // Class.h
    class Class
    {
    public :
        const static int Version = 1;
    };
    
    // Main.cpp
    #include "Class.h"
    static_assert(Class::Version > 1, "You need higher version than 1");
    
    // 예시 3 : 배열의 길이
    static_assert(sizeof(mArray) / sizeof(mArray[0]) == ARRAY_LENGTH, "The size of array is not ARRAY_LENGTH");
    

베스트 프랙티스

  • 최대한 assert보다 static_assert를 사용
  • assert를 사용한다면
    • 여전히 프로그램을 실행시켜야 됨
    • 실행 도중에만 어서션을 포착. 그것도 오직 디버그 빌드에서만
  • static_assert를 사용한다면
    • 컴파일 중에 모든 문제를 즉시 알아챔
    • 또한 컴파일러처럼 생각하는 데도 도움이 됨


참조

포큐아카데미 C++ 언매니지드 프로그래밍



💻 열심히 공부해서 작성 중이니 오류나 틀린 부분이 있을 경우 
  언제든지 댓글 혹은 메일로 알려주시면 감사하겠습니다! 😸

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기