C++ - static_assert

mohadang·2022년 10월 10일
0

C++

목록 보기
20/48
post-thumbnail

static_assert

  • 조건이 부합되지 않으면 '컴파일'이 되지 않도록 해줌(기존의 assert는 런타임 중에 문제 발생하면 브레이크 포인트 걸음)

  • assert(name != NULL)

    • call stack이 굉장히 보기 않좋아서 직접 만들어 사용하는 회사도 있음.
    • 어서션(assert)
      • 실행 중에 가정(assertion)이 맞는 지 평가
      • 오직 디버그 빌드에서만 작동
      • 실패한 assert를 보려면 반드시 프로그램을 실행해야 함.
        • 모든 코드 경로가 실행되었다고 어떻게 장담???
        • 일부 어서션은 프로그램을 실행하기도 전에 알 수 있음
      • 모든 곳에 assert를 쓰자
        • 여전히 유효한 조언
    • static_assert
      • 컴파일 중에 어서션 평가
      • 컴파일러가 assert 조건이 참인지 아닌지 앎
      • 실패하면 컴파일러는 컴파일 에러를 뱉음
      • 많은 경우에 유용
        • 대신 프로그래머가 이 문법들이 컴파일 타입에 결정 될 것인지 판단 해야함.

Ex) Student를 파일로 저장해서 관리하고 있었는데 어떤 이유에서 데이터 구조를 바꾸었다.

struct Student
{
  char name[62];
  char id[10];
  int currrentSemester;
};
  :
static_assert(sizeof(Student) == 74, "Student structure size mismatch");
  - Student 구조체가 74 바이트가 아니면 컴파일 에러 발생

Ex) 클래스 버전을 바꾸는 경우

class Class
{
public:
  const static int Version = 1;
};
  :
static_assert(Class::Version > 1, "You need higher version than 1.")

Ex)

class Student
{
public:
  static const int MAX_SCORES = 10;
  int GetScore(int index);
private:
  int mScores[MAX_SCORES];
};

static_assert(sizeof(mScores) / sizeof(mScores[0]) == MAX_SCORES, "The size of scores vector is not 10");

베스트 프랙티스

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

0개의 댓글