GCC是否有内置的编译时断言?

时间:2009-06-12 16:35:25

标签: c++ gcc static-assert

我们现有的编译时断言实现基于负数组索引,并且它在GCC上提供差的诊断输出。 C ++ 0x的static_assert是一个非常好的功能,它提供的诊断输出要好得多。我知道GCC已经实现了一些C ++ 0x功能。有谁知道static_assert是否属于他们之中,那么自GCC版本以来是否存在?

8 个答案:

答案 0 :(得分:29)

根据this page,自4.3以来,gcc已经static_assert

答案 1 :(得分:16)

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

#include <boost/static_assert.hpp>

BOOST_STATIC_ASSERT( /* assertion */ )

基本上,提升的作用是:

声明(但不要定义!)a

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) > }

诀窍是如果Condition为false,编译器需要实例化struct

STATIC_ASSERTION_FAILURE< false >

为了计算它的大小,由于未定义,因此失败。

答案 2 :(得分:8)

使用-std=c++0x标志编译时,以下代码与g ++ 4.4.0一起工作:

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

显示:

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

答案 3 :(得分:6)

如果您有较旧的gcc或使用较旧的C ++标准,或使用C,那么您可以按照此处所述模拟static_assert:http://www.pixelbeat.org/programming/gcc/static_assert.html

答案 4 :(得分:1)

这并没有真正回答这个问题,但我更喜欢基于switch-case的编译时断言,例如。

#define COMPILE_TIME_ASSERT(cond) do { switch(0) { case 0: case cond: ; } } while (0)

也可以在C语言中使用,而不仅仅是在C ++中。

答案 5 :(得分:1)

你可以随时使用模板和不存在的模板 通过模板专业化的结构。这是如何提升 据我所知,它做到了。这就是我用作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
}

答案 6 :(得分:1)

NSPR确实:

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

如果condition为false则失败,因为它声明了一个负长度数组。

答案 7 :(得分:0)

两个

    BOOST_STATIC_ASSERT(x)
    BOOST_STATIC_ASSERT_MSG(x, msg)
如果编译器支持,

将使用C ++ 11 static_assert