C++中的编译时断言?

Jak*_*les 5 c++

我最近发现需要在C++中使用编译时断言来检查两种类型的大小是否相等.

我在网上发现了以下宏(声称来自Linux内核):

#define X_ASSERT(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
Run Code Online (Sandbox Code Playgroud)

我喜欢这样:

X_ASSERT(sizeof(Botan::byte) != sizeof(char));
Run Code Online (Sandbox Code Playgroud)

这让我好奇-虽然这工作,是有一个更清洁的方式来做到这一点?(显然,不止一种方式)某些方法有优缺点吗?

Jam*_*lis 10

在C++ 0x中,有一个新的语言特性static_assert,它提供了生成编译时断言的标准方法.例如,

static_assert(sizeof(Botan::byte) != 1, "byte type has wrong size");
Run Code Online (Sandbox Code Playgroud)

Visual C++ 2010支持static_assert,g ++ 4.3(及更高版本)和Intel C++ 11.0也支持.


Jer*_*fin 6

您可能想看看Boost StaticAssert.内部不完全干净(或者不是我最后一次看)但至少它更容易被识别,因此大多数人都知道这意味着什么.如果内存服务,它也会产生更有意义的错误消息.

  • 我其实更喜欢[`BOOST_MPL_ASSERT_MSG`](http://www.boost.org/doc/libs/1_43_0/libs/mpl/doc/refmanual/assert-msg.html). (3认同)