2009-06-12 36 views
16

我們現有的編譯時聲明實現基於負數組索引,並且它在GCC上提供較差的診斷輸出。 C++ 0x的static_assert是一個非常好的功能,它提供的診斷輸出要好得多。我知道GCC已經實現了一些C++ 0x功能。有誰知道static_assert是否在其中,如果是GCC版本以後的話?GCC是否有內置的編譯時間斷言?

+1

http://en.wikichip.org/wiki/c/static_assertions – 2015-06-02 23:21:11

回答

29

根據this page,gcc從4.3開始已有static_assert

+19

+1不使用LMGTFY將使用C++ 11 static_assert 。 – Johnsyweb 2010-05-13 10:46:26

8

下面的代碼工作正常使用g ++ 4.4.0當與-std=c++0x標誌編譯:

int main() { 
    static_assert(false, "that was false"); 
} 

它顯示:

x.cpp: In function 'int main()': 
x.cpp:2: error: static assertion failed: "that was false" 
16

如果您需要使用gcc版本,其不支持它你可以使用

#include <boost/static_assert.hpp> 

BOOST_STATIC_ASSERT(/* assertion */) 

基本上,什麼提升是這樣的:

申報(但不定義!)一個

template< bool Condition > struct STATIC_ASSERTION_FAILURE; 

定義爲斷言成立的情況下專業化:

template <> struct STATIC_ASSERTION_FAILURE<true> {}; 

然後你就可以這樣定義STATIC_ASSERT:

#define STATIC_ASSERT(Condition) \ 
    enum { dummy = sizeof(STATIC_ASSERTION_FAILURE< (bool)(Condition) > } 

訣竅是,如果條件爲假,編譯器需要實例化struct

STATIC_ASSERTION_FAILURE<false> 

爲了計算它的大小,並且由於它沒有被定義而失敗。

+2

我不知道是否有任何方法可以使這樣的技巧出現明智的錯誤信息... – Thomas 2010-05-13 10:34:11

+0

根據文檔(http://www.boost.org/doc/libs/1_43_0/doc/html/boost_staticassert。 html),這是Boost.StaticAssert的目標之一:「BOOST_STATIC_ASSERT的目標之一是生成可讀的錯誤消息。這些會立即告訴用戶正在以不受支持的方式使用庫。「 – Philipp 2010-05-13 11:23:02

5

如果你有一箇舊的gcc或使用舊的C++標準,或使用C,那麼你可以在此描述效仿static_assert -專業化。就我所知,這是如何提升 。這是我用作static_assert的東西,它非常簡單。

namespace Internal 
{ 
template<bool x> struct SASSERT_F; 
template<  > struct SASSERT_F <true> {}; 
template<int x> struct SASSERT_P  {}; 
#define STATIC_ASSERT(B)   \ 
    typedef Internal::SASSERT_P <(\ 
    sizeof (Internal::SASSERT_F <(\ 
     ((B)? true : false)) >) \ 
           )> \ 
     StaticAssert##__LINE__ () 
} 

使用示例

int main(int argc, char **argv) 
{ 
    static_assert(sizeof(int) == 1)   // Error 
    static_assert(sizeof(int) == sizeof(int)) // OK 
} 
1

你可以隨時玩弄通過模板模板和不存在的 strutures:

1

NSPR作用:

#define PR_STATIC_ASSERT(condition) \ 
    extern void pr_static_assert(int arg[(condition) ? 1 : -1]) 

從而未能如果condition是假的,因爲它聲明負長度的數組。

0

兩個

BOOST_STATIC_ASSERT(x) 
    BOOST_STATIC_ASSERT_MSG(x, msg) 

,如果你的編譯器支持它

相關問題