static_assert

보물창고·2022년 8월 30일
0

assert( expr )

  • 개념

    런타임에 조건절이 거짓이면, 메시지를 출력하고, 프로그램을 종료시킴.

problem

: void foo(int num) { assert ~~ }; 을 만들고,
assert를 이용해서 거짓조건 만들어서 실행하라.

조건

  • cassert 헤더파일 필요함 .

코드 예시

: 우리가 사람의 나이를 출력하는 프로그램을 만든다고 하자.
이때 음수가 출력되면 안되겠지? 이를 염두하고 , 음수가 인자로 들어갈 경우,
프로그램을 종료시키는 프로그램을 assert 를 이용해 아래와 같이 만들 수 있다.

  • c시절부터 존재하는 assert의 한계는 런타임에만 사용이 가능하다!

static_assert ( 조건식, "종료출력문" )

특징

  • 런타임에 영향을 받는 변수등에 관해서는 사용불가함.
  • 반드시 컴파일 타임에 결정지을 수 있는 것들만 사용 가능함.
    예를 들면 template , 사이즈를 결정짓는 sizeof 등.

어디서 사용할건데?

: 템플릿 프로그래밍에서 assert를 사용할 수 없으니까. 템플릿 프로그래밍에서 사용하자.

장점

  • 컴파일 시간에 잘못된 것을 찾을 수 있음.
  • 가독성 높은 에러 메시지를 만들 수 있음.

개념

컴파일 시간에 조건식이 거짓이라면, msg를 출력하고, 컴파일을 멈추게함.

static_assert 모양

static_assert(bool 조건식 , message);

컴파일 시간에 결정짓는 예시 코드

  • 현재 32bit이므로, 포인터의 크기가 4이므로, 오류 발생함.

  • true이므로 이상 없음을 확인할 수 있음.

한계 : 런타임에 결정되는

: 실행시간에 값이 결정되는 변수를 조건식에 넣을 수 없음.
: static_assert 는 컴파일 타임에만 검사가 가능함.

static_assert의 활용

: 위 처럼 한계가 있는데 도대체 어디다가 사용할까???

구조체 크기 검사.

가) 패킷이라는 구조체에 int, char을 집어 넣고,
사이즈가 int + char 일 경우를 판단을 하는 static_assert를 만들자.

  • 설명 : 구조체 패딩은 최적화로 인해 가장 큰 데이터의 배수로
    사이즈가 결정되기 때문에 , 15번줄에서 에러가 발생하는 것을 확인할 수 있다.

    -> 해결하는 방법 #pragma pack(1) 을 사용하면 , 문제가 없음을 확인할 수 있다.

  • true일 경우

  • 요거는 그냥 반대로만 작성한 거고.

  • 원복하고, #pragma pack(1)을 작성해보자.
    : 문제 없음!

구조체 패딩

https://blog.naver.com/kimwontae466/222441551653

type_traits를 통해 확인하기.

나) mutex 객체 m1, m2의 경우, 복사 생성자가 없어서, 복사가 불가능함.
static_assert를 이용해 유저타입 Swap 함수에서
복사 검출확인을 진행하라.
-> 현재 오류코드는 단순히 복사가 안된다는 것을 나타내고 있음.

  • static_assert 와 복사 생성자여부를 확인하는 is_copyable과 함께 사용하자.
    : 복사가 되지 않기 때문에 not 이 출력됨을 확인할 수 있다.
profile
🔥🔥🔥

0개의 댓글