C ++中的编译时断言?

时间:2010-08-14 02:27:43

标签: c++

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

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

#define X_ASSERT(condition) ((void)sizeof(char[1 - 2*!!(condition)]))

我喜欢这样:

X_ASSERT(sizeof(Botan::byte) != sizeof(char));

这让我很好奇 - 虽然这个有效,有没有更清洁的方法呢? (显然,不止一种方式)某些方法有优缺点吗?

5 个答案:

答案 0 :(得分:10)

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

static_assert(sizeof(Botan::byte) != 1, "byte type has wrong size");

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

答案 1 :(得分:6)

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

答案 2 :(得分:1)

其他一些有趣的选项在这里:http://www.jaggersoft.com/pubs/CVu11_3.html

作者通过C(非C ++)规范寻找可用作编译时断言的语法。

答案 3 :(得分:1)

要做到这一点正确你需要一个C ++ 0x友好编译器,请参阅James McNellis和Jerry Coffins的回答。

你对1998或2003 C ++标准做不了多少。请查看这些链接以获取示例:

http://en.wikipedia.org/wiki/Assertion_(computing)#Static_assertions http://ksvanhorn.com/Articles/ctassert.html

答案 4 :(得分:0)

有一个很好的#error预处理器指令(请参阅here以获得一篇关于它的好文章),但我认为它需要在#if范围内而不是用于“独立的“在你的例子中使用。