[C++][Visual Studio]Visual studio 2010 C++0x new feature: static_assert
Visual studio 2010為C++的開發人員新增了static_assert這個C++0x的功能,能為程式提供編譯時期的斷言,相較於以往的assert,斷言動作是編譯時期觸發,非運行時期觸發,故不會有性能上的損耗,且在編譯後就能知道程式是否滿足運行的條件,不需像舊有的運行時斷言需將程式運行起來,且要執行到斷言的位置才能發現問題。適用於可在編譯時期做的檢查動作。
static_assert的函式原型如下:
static_assert( constant-expression, string-literal );
constant-expression是用作斷言的判斷式,描述在這個時間點所應滿足的條件。string-literal是斷言觸發時所要顯式的提示訊息,使用上跟舊有的assert類似。
這邊來看個較為完整的範例,可以看到static_assert可以用於判別前置處理器的值、指標的大小、常數的大小、樣版的參數...等,所有在編譯時期可以判斷出來的資訊都可以拿來作為斷言的條件。
// test static_assert.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#define DEFAULT_VALUE 0
#define MAX_VALUE 100
const int VALUE = 10;
struct MyStruct
{
char data[1024];
};
template < class T, int Size >
class Vector
{
static_assert(Size > 0, "Vector size must be bigger than zero!");
T m_values[Size];
};
int _tmain(int argc, _TCHAR* argv[])
{
static_assert( sizeof(void *) == 4, "64-bit code generation is not supported.");
static_assert( MAX_VALUE > DEFAULT_VALUE, "DEFAULT_VALUE must be smaller than MAX_VALUE" );
static_assert( MAX_VALUE > VALUE, "VALUE must be smaller than MAX_VALUE" );
static_assert( sizeof( MyStruct ) < 1024*1024, "The structure size exceeds stack size" );
Vector<int, 10> intArray;
return 0;
}
編譯後若斷言判斷出當下的設定不符合預期,編譯會失敗,並像下面這樣將在撰寫斷言時所提供的提示顯示在錯誤清單中。