Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
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
Tags more
Archives
Today
Total
관리 메뉴

Pure Software Engineer :)

[C, C++] Compile time assertion 본문

Software Engineering/Programming

[C, C++] Compile time assertion

HelloJaewon 2013. 12. 12. 10:15

프로그램 실행중에 특정 값이나 조건이 성립하는지 확인하기 위해 ASSERT 매크로를 사용한다.

조건이 실패하게 되면 abort 같은 것을 통해 실행중인 프로그램이 즉시 종료하게 된다.

(무조건 abort()가 아니라 컴파일러마다 다른 방법으로 종료하는지는 확실하지 않다. 확인이 필요함)

 

하지만 프로그램 실행중이 아니라, 컴파일 타임에 특정 조건이 성립하는지 확인할 수 있다면 미리 검사하는 것이 더 좋을 것이다.

이러한 방법을 compile time assertion 또는 static assertion 이라고 부른다.

 

boost 라이브러리나, C++0x 에서부터는 static_assert 를 통해 지원하는 것 같지만,

이를 사용하지 않고도 다음과 같이 간단한 매크로를 정의하여 쉽게 사용할 수 있다.

 

 

1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
#define STATIC_ASSERT(condition, name) \
    typedef char assert_## name [(condition) ? 1 : -1];
 
int main (void)
{
    STATIC_ASSERT(1 == 2, first_test);
 
    return 0;
}

 

위의 코드를 컴파일 하려 하면 다음과 같은 컴파일 에러 메시지를 볼 수 있다.

test.cpp(7) : error C2118: negative subscript

 

코드의 원리는 간단하다.

typedef 을 통해서 char 형을 assert_first_test[1] 또는 assert_first_test[-1] 을 정의하게 되는데

조건이 참이면 1 거짓이면 -1이 된다.

배열의 인덱스는 0부터 시작하기 때문에 조건이 거짓이 되어 -1이 되면 negative subscript라는 컴파일 에러가 난다.

 

References

http://stackoverflow.com/questions/6765770/compile-time-assertion