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

Vla*_*sev 17 c++ gcc static-assert

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

Eva*_*ran 29

根据这个页面,gcc已经有static_assert4.3了.


Tob*_*ias 16

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

#include <boost/static_assert.hpp>

BOOST_STATIC_ASSERT( /* assertion */ )
Run Code Online (Sandbox Code Playgroud)

基本上,提升的作用是:

声明(但不要定义!)a

template< bool Condition > struct STATIC_ASSERTION_FAILURE;
Run Code Online (Sandbox Code Playgroud)

为断言持有的情况定义专门化:

template <> struct STATIC_ASSERTION_FAILURE< true > {};
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样定义STATIC_ASSERT:

#define STATIC_ASSERT(Condition) \ 
  enum { dummy = sizeof(STATIC_ASSERTION_FAILURE< (bool)(Condition) > }
Run Code Online (Sandbox Code Playgroud)

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

STATIC_ASSERTION_FAILURE< false >
Run Code Online (Sandbox Code Playgroud)

为了计算它的大小,这个失败,因为它没有定义.

  • 我想知道是否有任何方法可以从这样的技巧中出现明智的错误信息... (2认同)

小智 8

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

int main() {
    static_assert( false, "that was false" );
}
Run Code Online (Sandbox Code Playgroud)

它显示:

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


pix*_*eat 6

如果你有一个较旧的gcc或使用较旧的C++标准,或使用C,那么你可以模拟static_assert,如下所述:http://www.pixelbeat.org/programming/gcc/static_assert.html