Visual Studio 2010 공식 팀 블로그 @vsts2010

[VC++] 3. static_assert

C++0x 2009/04/27 15:00
Posted by 흥배

이번은 이전 회의 auto에 이어서 C++0x의 새로운 키워드 중의 하나인 static_assert에 대해서 설명합니다.  내용이 짧고 간단한 것이므로 미루지 말고 지금 바로 보고, 또 머리에 쏙 넣어주세요.^^

 


 

assert #error

C++로 프로그래밍할 때 버그나 에러가 발생할 위험이 있는 부분에 경고를 발생시키기 위하여 assert 매크로나 #error 프리프로세서 디렉티브를 사용합니다.

assert #error 중 보통 assert를 자주 사용합니다.

assert는 논리적인 오류 찾기, 작업 결과 확인, 처리해야 할 오류 조건 테스트를 할때 사용합니다.

 

asser는 실행 시간에 사용하고(보통 디버그 모드에서 사용하죠), #error은 프리프로세스에서 사용합니다(프리프로세스는 #ifdef를 사용할 때를 말합니다).

 

< code. 1 assert 사용 예 >

assert( MinMoney > 100)

 


 

assert #error를 사용할 수 없을 때

assert는 실행 시에 사용하고, #error는 프리프로세스에 사용하기 때문에 템플릿 실체화 시(컴파일 타임)에는 이것들을 사용할 수 없습니다.

 

static_assert는 컴파일 시점에서 실체화할 템플릿의 전제 조건을 조사할 때 사용하면 좋습니다.


Stack이라는 클래스 템플릿을 정의할 때 템플릿 파라메터로 type과 크기를 사용할 때 크기가 일정 크기 이상일 때만 컴파일 되기를 바란다면 static_assert를 사용하면 딱 좋습니다.

 

 

 

static_assert

 static_assert의 형식은 다음과 같습니다.

      static_assert( ''constant-expression'', ''error-message'' ) ;

''constant-expression” – 검사할 조건 식

''error-message''      - 조건이 false일 경우 출력할 error 메시지

 

constant-expression false일 경우 컴파일러는 에러 메시지를 출력합니다.


static_assert는 템플릿 이외에서 사용해도 유용합니다.

1. 기본 타입(int, long )이나 유저 정의 타입(class, struct 등으로 만든 타입)의 크기를 확인하고 싶을 때.

2. 어떤 타입의 최대 크기를 넘어서는지 확인하고 싶을 때.

등등 유용하게 사용할 수 있습니다.

 

 

 


static_assert 사용 예

 

1. 프리프로세스 디렉티브 대체


< code. 2  상수 값의 크기 조사 >

#include <iostream>

using namespace std;

 

const int MAX_LEVEL = 120;

 

int main()

{

      static_assert( MAX_LEVEL <= 100, "Warring - MAX_LEVEL" );

      return 0;

}

 

< 컴파일 결과 >


 

<Code. 2>는 MAX_LEVEL의 값이 100을 넘으면 컴파일 할 때 에러를 출력합니다.


VC++ 10의 경우 편리한 IntelliSense가 컴파일 하기 전에 붉은 밑줄로 에러가 있음을 사전에 알려주기도 합니다.

 

 

 

2. 템플릿에서 사용


< Code 3. Stack 클래스 템플릿의  최소 스택 크기 조사 >

#include <iostream>

using namespace std;

 

template< typename T1, int StackSize >

class MYSTACK

{

       static_assert( StackSize >= 10, "Stack Size Error" );

public :

     MYSTACK() : data( new T[StackSize] )

     {

     }

 

private:

     T1* data;

};

 

int main()

{

     MYSTACK< int, 5 > MyStack;

     return 0;

}

 

< 컴파일 결과 >

 

 


3. 변수의 크기 조사


< Code. 4  int 타입의 크기 조사 >

#include <iostream>

using namespace std;

 

int main()

{

      static_assert( sizeof(int) == 4, "not int size 4" );

      return 0;

}




static_assert의 개념이나 사용 법이 간단하기 때문에 위의 예제 코드를 보면 어떻게 사용하고, 어디에 사용하면 좋을지 알수 있으리라 생각합니다.



static_assert의 핵심

1. assert와 비슷한 조건 조사를 할 수 있음.

2. 컴파일 타임 때 사용.

3. 템플릿 프로그래밍에 사용하면 유용하다.




ps :

위키피디아에 있는 static_assert 설명

http://en.wikipedia.org/wiki/C%2B%2B0x#Static_assertions




저작자 표시
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요