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