【问题标题】:Compile-time assertions in C++?C ++中的编译时断言?
【发布时间】:2010-08-14 02:27:43
【问题描述】:

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

我在网上找到了以下宏(据说来自Linux内核):

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

我是这样使用的:

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

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

【问题讨论】:

  • 感谢大家的所有回答,非常有趣。我很高兴看到 C++0x 得到了static_assert,我不记得以前读过它。 ;)

标签: c++


【解决方案1】:

在 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 也是如此。

【讨论】:

    【解决方案2】:

    您可能想看看Boost StaticAssert。内部不是很干净(或者不是我最后一次看),但至少它更容易辨认,所以大多数人都知道它的含义。如果有记忆的话,产生更有意义的错误消息也会费力。

    【讨论】:

    【解决方案3】:

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

    当作者在 C(不是 C++)规范中寻找可以用作编译时断言的语法时,请仔细阅读。

    【讨论】:

      【解决方案4】:

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

      对于 1998 年或 2003 年的 C++ 标准,您无能为力。看看这些链接的例子:

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

      【讨论】:

        【解决方案5】:

        有一个出色的 #error 预处理器指令(参见 here 以获得关于它的好文章),但我认为它需要在 #if 内,而不是在“独立”中使用您的示例使用。

        【讨论】:

        • #error 的缺点是它是一个预处理指令,并且在解析源之前进行评估,并且您不能在控制 @987654326 中使用 sizeof 或非宏常量之类的东西@ 指令。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 2014-08-11
        相关资源
        最近更新 更多