我最近发现需要在C ++中使用编译时断言来检查两种类型的大小是否相等。
我在网上发现了以下宏(声称来自Linux内核):
#define X_ASSERT(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
我喜欢这样:
X_ASSERT(sizeof(Botan::byte) != sizeof(char));
这让我很好奇 - 虽然这个有效,有没有更清洁的方法呢? (显然,不止一种方式)某些方法有优缺点吗?
答案 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
范围内而不是用于“独立的“在你的例子中使用。