Tag: static assert

在static_assert输出中整合types名称?

我喜欢提供有用的错误/消息,我也想为我的static_assert这样做。 问题是,他们依赖于模板参数。 通常情况下,这些参数会因为出错而显示在屏幕上或者其他屏幕上,但是这些参数要么是模糊的,要么是没有分组,所以它们是有意义的。 例: template<class T> struct fake_dependency{ static bool const value = false; }; template<class T, class Tag> struct Foo{ Foo(){} template<class OtherTag> Foo(Foo<T, OtherTag> const&){ static_assert(fake_dependency<T>::value, "Cannot create Foo<T,Tag> from Foo<T,OtherTag>."); } }; int main(){ Foo<int, struct TagA> fA; Foo<int, struct TagB> fB(fA); } MSVC输出: src\main.cpp(74): error C2338: Cannot create Foo<T,Tag> from Foo<T,OtherTag>. […]

C ++ 11 – 在constexpr函数内的static_assert?

如何在constexpr函数中正确地执行static_assert ? 例如: constexpr int do_something(int x) { static_assert(x > 0, "x must be > 0"); return x + 5; } 这是无效的C ++ 11代码,因为一个constexpr函数只能包含一个return语句。 我不认为这个标准有一个例外,但是GCC 4.7不允许我编译这个代码。

在构build时在C中ASSERTexpression式的方法

我正在整理一些在整个地方使用“神奇数字”来设置硬件寄存器的旧代码,我想用常数而不是这些数字来使代码更具performance力(实际上它们将映射到名称/用来logging寄存器的值)。 不过,我担心随着变化量的增加,我可能会打破魔法数字。 这是一个简单的例子(寄存器组更复杂): const short mode0 = 0; const short mode1 = 1; const short mode2 = 2; const short state0 = 0; const short state1 = 4; const short state2 = 8; 所以不是: set_register(5); 我们有: set_register(state1|mode1); 我正在寻找的是一个构build时间版本: ASSERT(5==(state1|mode1)); 更新 @Christian,感谢您的快速响应,我也对C / non-boost环境的答案感兴趣,因为这是驱动程序/内核代码。

在C中静态断言

在C(而不是C ++)中实现编译时静态断言的最好方法是什么,特别强调GCC?